-- MySQL dump 10.13  Distrib 5.7.36, for Linux (x86_64)
--
-- Host: localhost    Database: dblog
-- ------------------------------------------------------
-- Server version	5.7.36

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `biz_ad`
--

DROP TABLE IF EXISTS `biz_ad`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `biz_ad` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `type` varchar(50) NOT NULL COMMENT '广告类型',
  `position` varchar(50) DEFAULT NULL COMMENT '广告位置',
  `title` varchar(255) DEFAULT NULL COMMENT '广告标题',
  `content` text NOT NULL COMMENT '广告内容',
  `picture` varchar(1000) DEFAULT NULL COMMENT '广告图片',
  `link` varchar(1000) DEFAULT NULL COMMENT '广告链接',
  `expiring_date` datetime DEFAULT NULL COMMENT '广告到期日',
  `show_number` int(10) unsigned DEFAULT NULL COMMENT '展示次数',
  `click_number` int(10) unsigned DEFAULT NULL COMMENT '点击次数',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='广告';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `biz_ad`
--

LOCK TABLES `biz_ad` WRITE;
/*!40000 ALTER TABLE `biz_ad` DISABLE KEYS */;
/*!40000 ALTER TABLE `biz_ad` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `biz_article`
--

DROP TABLE IF EXISTS `biz_article`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `biz_article` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文章标题',
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
  `cover_image` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文章封面图片',
  `editor_type` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '当前文章适用的编辑器类型',
  `qrcode_path` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文章专属二维码地址',
  `is_markdown` tinyint(3) unsigned DEFAULT '1',
  `content` mediumtext COLLATE utf8mb4_unicode_ci COMMENT '文章内容',
  `content_md` mediumtext COLLATE utf8mb4_unicode_ci COMMENT 'markdown版的文章内容',
  `top` tinyint(1) DEFAULT '0' COMMENT '是否置顶',
  `type_id` bigint(20) unsigned NOT NULL COMMENT '类型',
  `status` tinyint(3) unsigned DEFAULT NULL COMMENT '状态',
  `recommended` tinyint(3) unsigned DEFAULT '0' COMMENT '是否推荐',
  `original` tinyint(3) unsigned DEFAULT '1' COMMENT '是否原创',
  `description` varchar(300) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文章简介，最多200字',
  `keywords` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文章关键字，优化搜索',
  `comment` tinyint(3) unsigned DEFAULT '1' COMMENT '是否开启评论',
  `password` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '文章私密访问时的密钥',
  `required_auth` tinyint(3) unsigned DEFAULT NULL COMMENT '该文章是否登录后才可访问',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `biz_article`
--

LOCK TABLES `biz_article` WRITE;
/*!40000 ALTER TABLE `biz_article` DISABLE KEYS */;
INSERT INTO `biz_article` VALUES (3,'minikube安装',1,'','we',NULL,0,'<p><a href=\"https://minikube.sigs.k8s.io/\"><code>minikube</code></a>&nbsp;是一个工具， 能让你在本地运行 Kubernetes。以便你来尝试 Kubernetes 或者开展每天的开发工作。</p><p>参考官方文档 ： <a href=\"https://minikube.sigs.k8s.io/docs/start/\">https://minikube.sigs.k8s.io/docs/start/</a></p><h2>设置minikube用户：</h2><pre><code>创建用户\nuseradd -m minikube\n设置密码\npasswd minikube\n授予用户sudo权限\n使用root用户修改 /etc/sudoers.d/90-cloud-init-users 文件添加或者输入命令添加\nminikube ALL=(ALL) NOPASSWD:ALL\n添加docker到新用户\nsudo usermod -aG docker minikube &amp;&amp; newgrp docker\n\n</code></pre><h2>linux x86：</h2><pre><code>切换到minikube用户下执行\n下载：\ncurl -LO &lt;https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64&gt;\n安装：\nsudo install minikube-linux-amd64 /usr/local/bin/minikube &amp;&amp; rm minikube-linux-amd64\n\n</code></pre><p>安装完成后创建集群：</p><pre><code>minikube start\n（如果使用root用户启动应用程序，需要增加参数 --force --driver=docker）\n注：由于部分网站被墙，导致不能拉取镜像，此处会报错，参考下面解决方案。\n</code></pre><p>安装完成</p><p><br/></p><p>安装报错：</p><ol>\n<li>Unable to find image \'<a href=\"http://gcr.io/k8s-minikube/kicbase:v0.0.44@sha256:eb04641328b06c5c4a14f4348470e1046bbcf9c2cbc551486e343d3a49db557e\">gcr.io/k8s-minikube/kicbase:v0.0.44@sha256:eb04641328b06c5c4a14f4348470e1046bbcf9c2cbc551486e343d3a49db557e</a>\' locally\ndocker: Error response from daemon: Get \"<a href=\"https://gcr.io/v2/\">https://gcr.io/v2/</a>\": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).</li>\n</ol><p>解决：由于本地没有<a href=\"http://gcr.io/k8s-minikube/kicbase:v0.0.44@sha256:eb04641328b06c5c4a14f4348470e1046bbcf9c2cbc551486e343d3a49db557e\">kicbase</a>镜像去仓库拉取但被屏蔽，导致超时。使用阿里云镜像</p><pre><code>docker pull [registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.44](&lt;http://registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.44&gt;) \n\nminikube detele\nminikube start --base-image=\'registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.44\'\n\n</code></pre><ol>\n<li>❌  Exiting due to RT_DOCKER_MISSING_CRI_DOCKER_NONE: sudo systemctl enable cri-docker.socket: Process exited with status 1</li>\n</ol><p>解决：由于k8s 1.24开始，dockershim已经从kubelet中移除，但因为历史问题Docker却不支持K8S主推的CRI。可以在kubelet和Docker之间加上一个中间层cri-docker。</p><p>下载所需版本https://github.com/Mirantis/cri-dockerd/releases</p><p>上传到服务器，执行安装命令</p><pre><code>sudo rpm -ivh cri-dockerd-0.3.14-3.el7.x86_64.rpm\n</code></pre><ol>\n<li>⛔  Exiting due to RSRC_INSUFFICIENT_CONTAINER_MEMORY: docker only has 1756MiB available, less than the required 1800MiB for Kubernetes</li>\n</ol><p>解决：服务器最大内存不到2G，不满足默认启动内存，需要指定启动内存参数</p><pre><code>minikube start --force --cpus 2 --memory=1500mb\n</code></pre><p>安装后启动</p><pre><code>sudo systemctl daemon-reload &amp;&amp; sudo systemctl enable cri-docker.socket\nsudo systemctl start cri-docker.socket cri-docker\n\nminikube detele\nminikube start --base-image=\'registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.44\'\n\n</code></pre><h2>安装kubectl</h2><p>参考：<a href=\"https://www.notion.so/kubectl-aacdb581fb08476090b3976e42a8d342?pvs=21\"></a><a href=\"https://www.notion.so/kubectl-aacdb581fb08476090b3976e42a8d342?pvs=4\">https://www.notion.so/kubectl-aacdb581fb08476090b3976e42a8d342?pvs=4</a></p><h2>minikube命令：</h2><pre><code>#创建集群\nminikube start\n#删除\nminikube delete\n\n#启动仪表盘\nminikube dashboard\n#开启外网访问，新打开窗口执行\nkubectl proxy --port=8000 --address=0.0.0.0 --accept-hosts=^.*\n\n</code></pre><p>替换IP和PORT在浏览器中访问控制台界面</p><p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n</p><p><br/></p><img src=\"nulloneblog/article/20240913144458241.png\" alt=\"\" style=\"max-width: 100%;height: auto;border-radius: 6px;\"/><img src=\"nulloneblog/article/20240913144501343.png\" alt=\"\" style=\"max-width: 100%;height: auto;border-radius: 6px;\"/><img src=\"nulloneblog/article/20240913144505609.png\" alt=\"\" style=\"max-width: 100%;height: auto;border-radius: 6px;\"/>',NULL,0,2,1,0,1,'linux安装minikube','k8s minikube',1,'',0,'2024-07-11 14:47:09','2024-07-11 14:47:09'),(4,'nacos修改持久化数据源oracle',1,'','we',NULL,0,'<p>本次使用的是nacos2.2.0版本</p><ol>\n<li>下载源码</li>\n</ol><p><a href=\"https://github.com/alibaba/nacos/releases/tag/2.2.0\">https://github.com/alibaba/nacos/releases/tag/2.2.0</a></p><p><a href=\"\"></a></p><ol>\n<li>nacos-all.pom增加</li>\n</ol><pre><code>        		&lt;dependency&gt;\n                &lt;groupId&gt;com.oracle.ojdbc&lt;/groupId&gt;\n                &lt;artifactId&gt;ojdbc8&lt;/artifactId&gt;\n                &lt;version&gt;${ojdbc.version}&lt;/version&gt;\n            &lt;/dependency&gt;\n</code></pre><p>nacos-config.pom增加</p><pre><code>      	&lt;dependency&gt;\n            &lt;groupId&gt;com.oracle.ojdbc&lt;/groupId&gt;\n            &lt;artifactId&gt;ojdbc8&lt;/artifactId&gt;\n        &lt;/dependency&gt;\n</code></pre><ol>\n<li>修改ExternalDataSourceProperties</li>\n</ol><pre><code>/*\n * Copyright 1999-2018 Alibaba Group Holding Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * &lt;http://www.apache.org/licenses/LICENSE-2.0&gt;\n *\n * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on\n * an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations under the License.\n */\n\npackage com.alibaba.nacos.config.server.service.datasource;\n\nimport com.alibaba.nacos.common.utils.Preconditions;\nimport com.alibaba.nacos.common.utils.StringUtils;\nimport com.zaxxer.hikari.HikariDataSource;\nimport org.apache.commons.collections.CollectionUtils;\nimport org.springframework.boot.context.properties.bind.Bindable;\nimport org.springframework.boot.context.properties.bind.Binder;\nimport org.springframework.core.env.Environment;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\n\nimport static com.alibaba.nacos.common.utils.CollectionUtils.getOrDefault;\n\n/**\n * Properties of external DataSource.\n *\n * @author Nacos\n */\npublic class ExternalDataSourceProperties {\n\n    //update\n    private String jdbcDriverName;\n\n    //update\n    private String testQuery;\n\n    private Integer num;\n\n    private List&lt;String&gt; url = new ArrayList&lt;&gt;();\n\n    private List&lt;String&gt; user = new ArrayList&lt;&gt;();\n\n    private List&lt;String&gt; password = new ArrayList&lt;&gt;();\n\n    public void setNum(Integer num) {\n        this.num = num;\n    }\n\n    public void setUrl(List&lt;String&gt; url) {\n        this.url = url;\n    }\n\n    public void setUser(List&lt;String&gt; user) {\n        this.user = user;\n    }\n\n    public void setPassword(List&lt;String&gt; password) {\n        this.password = password;\n    }\n\n    //add new\n    public void setTestQuery(String testQuery) {\n        if (StringUtils.isBlank(testQuery)) {\n            this.testQuery = \"SELECT 1\";\n        } else {\n            this.testQuery = testQuery;\n        }\n    }\n\n    //add new\n    public void setJdbcDriverName(String jdbcDriverName) {\n        if (StringUtils.isBlank(jdbcDriverName)) {\n            this.jdbcDriverName = \"com.mysql.cj.jdbc.Driver\";\n        } else {\n            this.jdbcDriverName = jdbcDriverName;\n        }\n    }\n\n    /**\n     * Build serveral HikariDataSource.\n     *\n     * @param environment {@link Environment}\n     * @param callback    Callback function when constructing data source\n     * @return List of {@link HikariDataSource}\n     */\n    List&lt;HikariDataSource&gt; build(Environment environment, Callback&lt;HikariDataSource&gt; callback) {\n        List&lt;HikariDataSource&gt; dataSources = new ArrayList&lt;&gt;();\n        Binder.get(environment).bind(\"db\", Bindable.ofInstance(this));\n        Preconditions.checkArgument(Objects.nonNull(num), \"db.num is null\");\n        Preconditions.checkArgument(CollectionUtils.isNotEmpty(user), \"db.user or db.user.[index] is null\");\n        Preconditions.checkArgument(CollectionUtils.isNotEmpty(password), \"db.password or db.password.[index] is null\");\n        for (int index = 0; index &lt; num; index++) {\n            int currentSize = index + 1;\n            Preconditions.checkArgument(url.size() &gt;= currentSize, \"db.url.%s is null\", index);\n            DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(environment);\n            if (StringUtils.isEmpty(poolProperties.getDataSource().getDriverClassName())) {\n                poolProperties.setDriverClassName(jdbcDriverName);\n            }\n            poolProperties.setJdbcUrl(url.get(index).trim());\n            poolProperties.setUsername(getOrDefault(user, index, user.get(0)).trim());\n            poolProperties.setPassword(getOrDefault(password, index, password.get(0)).trim());\n            HikariDataSource ds = poolProperties.getDataSource();\n            if (StringUtils.isEmpty(ds.getConnectionTestQuery())) {\n                ds.setConnectionTestQuery(testQuery);\n            }\n            dataSources.add(ds);\n            callback.accept(ds);\n        }\n        Preconditions.checkArgument(CollectionUtils.isNotEmpty(dataSources), \"no datasource available\");\n        return dataSources;\n    }\n\n    interface Callback&lt;D&gt; {\n\n        /**\n         * Perform custom logic.\n         *\n         * @param datasource dataSource.\n         */\n        void accept(D datasource);\n    }\n}\n</code></pre><ol>\n<li>修改DataSourceConstant</li>\n</ol><pre><code>/*\n * Copyright 1999-2022 Alibaba Group Holding Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      &lt;http://www.apache.org/licenses/LICENSE-2.0&gt;\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.alibaba.nacos.plugin.datasource.constants;\n\n/**\n * The data source name.\n *\n * @author hyx\n **/\n\npublic class DataSourceConstant {\n    public static final String MYSQL = \"mysql\";\n    \n    public static final String DERBY = \"derby\";\n\n    public static final String ORCLE = \"oracle\";\n}\n</code></pre><ol>\n<li>在<strong>nacos-datasource-plugin模plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/impl/目录新建oracle目录，再在oracle目录新增</strong>下增加9个文件</li>\n</ol><p><a href=\"https://prod-files-secure.s3.us-west-2.amazonaws.com/cd36ae31-85ee-4a44-955d-462b2bb91fcc/346f1327-e0c0-427b-b15a-a54fce898e23/mapper.zip\">mapper.zip</a></p><ol>\n<li>修改com.alibaba.nacos.plugin.datasource.mapper.Mapper</li>\n</ol><pre><code>#\n# Copyright 1999-2022 Alibaba Group Holding Ltd.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      &lt;http://www.apache.org/licenses/LICENSE-2.0&gt;\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\ncom.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoAggrMapperByMySql\ncom.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoBetaMapperByMySql\ncom.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoMapperByMySql\ncom.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoTagMapperByMySql\ncom.alibaba.nacos.plugin.datasource.impl.mysql.ConfigTagsRelationMapperByMySql\ncom.alibaba.nacos.plugin.datasource.impl.mysql.HistoryConfigInfoMapperByMySql\ncom.alibaba.nacos.plugin.datasource.impl.mysql.TenantInfoMapperByMySql\ncom.alibaba.nacos.plugin.datasource.impl.mysql.TenantCapacityMapperByMySql\ncom.alibaba.nacos.plugin.datasource.impl.mysql.GroupCapacityMapperByMysql\n\ncom.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoAggrMapperByDerby\ncom.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoBetaMapperByDerby\ncom.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoMapperByDerby\ncom.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoTagMapperByDerby\ncom.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoTagsRelationMapperByDerby\ncom.alibaba.nacos.plugin.datasource.impl.derby.HistoryConfigInfoMapperByDerby\ncom.alibaba.nacos.plugin.datasource.impl.derby.TenantInfoMapperByDerby\ncom.alibaba.nacos.plugin.datasource.impl.derby.TenantCapacityMapperByDerby\ncom.alibaba.nacos.plugin.datasource.impl.derby.GroupCapacityMapperByDerby\n\ncom.alibaba.nacos.plugin.datasource.impl.oracle.ConfigInfoAggrMapperByOracle\ncom.alibaba.nacos.plugin.datasource.impl.oracle.ConfigInfoBetaMapperByOracle\ncom.alibaba.nacos.plugin.datasource.impl.oracle.ConfigInfoMapperByOracle\ncom.alibaba.nacos.plugin.datasource.impl.oracle.ConfigInfoTagMapperByOracle\ncom.alibaba.nacos.plugin.datasource.impl.oracle.ConfigTagsRelationMapperByOracle\ncom.alibaba.nacos.plugin.datasource.impl.oracle.HistoryConfigInfoMapperByOracle\ncom.alibaba.nacos.plugin.datasource.impl.oracle.TenantInfoMapperByOracle\ncom.alibaba.nacos.plugin.datasource.impl.oracle.TenantCapacityMapperByOracle\ncom.alibaba.nacos.plugin.datasource.impl.oracle.GroupCapacityMapperByOracle\n</code></pre><ol>\n<li><strong>nacos-common模块 StringUtils.java</strong></li>\n</ol><pre><code>//增加静态字符串\n	public static final String NULL = \"null\";\n</code></pre><ol>\n<li><strong>nacos-config模块 HistoryController.java</strong></li>\n</ol><p>将3处 <code>StringUtils.*EMPTY</code>  换成*<code>StringUtils.*NULL*</code></p><p><a href=\"http://ExternalCommonPersistServiceImpl.java\">**ExternalCommonPersistServiceImpl.java</a>  替换** <code>insertTenantInfoAtomic</code>方法</p><pre><code>@Override\n    public void insertTenantInfoAtomic(String kp, String tenantId, String tenantName, String tenantDesc,\n            String createResoure, final long time) {\n        try {\n            TenantInfoMapper tenantInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.TENANT_INFO);\n            Integer id = jt.queryForObject(\"select SEQ_TENANT_INFO.nextval from dual\", Integer.class);\n            jt.update(tenantInfoMapper.insert(\n                    Arrays.asList(\"id\", \"kp\", \"tenant_id\", \"tenant_name\", \"tenant_desc\", \"create_source\", \"gmt_create\",\n                            \"gmt_modified\")), id, kp, tenantId, tenantName, tenantDesc, createResoure, time, time);\n        } catch (DataAccessException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n</code></pre><p><a href=\"http://ExternalConfigInfoPersistServiceImpl.java\">**ExternalConfigInfoPersistServiceImpl.java</a> 替换代码**</p><pre><code>/*\n * Copyright 1999-2022 Alibaba Group Holding Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      &lt;http://www.apache.org/licenses/LICENSE-2.0&gt;\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.alibaba.nacos.config.server.service.repository.extrnal;\n\nimport com.alibaba.nacos.api.exception.NacosException;\nimport com.alibaba.nacos.common.utils.MD5Utils;\nimport com.alibaba.nacos.common.utils.Pair;\nimport com.alibaba.nacos.common.utils.StringUtils;\nimport com.alibaba.nacos.config.server.configuration.ConditionOnExternalStorage;\nimport com.alibaba.nacos.config.server.constant.Constants;\nimport com.alibaba.nacos.config.server.enums.FileTypeEnum;\nimport com.alibaba.nacos.config.server.model.ConfigAdvanceInfo;\nimport com.alibaba.nacos.config.server.model.ConfigAllInfo;\nimport com.alibaba.nacos.config.server.model.ConfigInfo;\nimport com.alibaba.nacos.config.server.model.ConfigInfoBase;\nimport com.alibaba.nacos.config.server.model.ConfigInfoWrapper;\nimport com.alibaba.nacos.config.server.model.ConfigKey;\nimport com.alibaba.nacos.config.server.model.Page;\nimport com.alibaba.nacos.config.server.model.SameConfigPolicy;\nimport com.alibaba.nacos.config.server.service.datasource.DataSourceService;\nimport com.alibaba.nacos.config.server.service.datasource.DynamicDataSource;\nimport com.alibaba.nacos.config.server.service.repository.ConfigInfoPersistService;\nimport com.alibaba.nacos.config.server.service.repository.HistoryConfigInfoPersistService;\nimport com.alibaba.nacos.config.server.service.repository.PaginationHelper;\nimport com.alibaba.nacos.config.server.utils.LogUtil;\nimport com.alibaba.nacos.config.server.utils.ParamUtils;\nimport com.alibaba.nacos.plugin.datasource.MapperManager;\nimport com.alibaba.nacos.plugin.datasource.constants.TableConstant;\nimport com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoMapper;\nimport com.alibaba.nacos.plugin.datasource.mapper.ConfigTagsRelationMapper;\nimport com.alibaba.nacos.plugin.encryption.handler.EncryptionHandler;\nimport com.alibaba.nacos.sys.env.EnvUtil;\nimport org.apache.commons.collections.CollectionUtils;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.context.annotation.Conditional;\nimport org.springframework.dao.DataAccessException;\nimport org.springframework.dao.DataIntegrityViolationException;\nimport org.springframework.dao.EmptyResultDataAccessException;\nimport org.springframework.dao.IncorrectResultSizeDataAccessException;\nimport org.springframework.jdbc.CannotGetJdbcConnectionException;\nimport org.springframework.jdbc.core.JdbcTemplate;\nimport org.springframework.jdbc.core.PreparedStatementCreator;\nimport org.springframework.jdbc.support.GeneratedKeyHolder;\nimport org.springframework.jdbc.support.KeyHolder;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.TransactionStatus;\nimport org.springframework.transaction.support.TransactionCallback;\nimport org.springframework.transaction.support.TransactionTemplate;\n\nimport java.io.IOException;\nimport java.sql.Connection;\nimport java.sql.PreparedStatement;\nimport java.sql.SQLException;\nimport java.sql.Timestamp;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\n\nimport static com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_ADVANCE_INFO_ROW_MAPPER;\nimport static com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_ALL_INFO_ROW_MAPPER;\nimport static com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_INFO_BASE_ROW_MAPPER;\nimport static com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_INFO_ROW_MAPPER;\nimport static com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_INFO_WRAPPER_ROW_MAPPER;\nimport static com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_KEY_ROW_MAPPER;\n\n/**\n * ExternalConfigInfoPersistServiceImpl.\n *\n * @author lixiaoshuang\n */\n@SuppressWarnings(value = {\"PMD.MethodReturnWrapperTypeRule\", \"checkstyle:linelength\"})\n@Conditional(value = ConditionOnExternalStorage.class)\n@Service(\"externalConfigInfoPersistServiceImpl\")\npublic class ExternalConfigInfoPersistServiceImpl implements ConfigInfoPersistService {\n    \n    private static final String DATA_ID = \"dataId\";\n    \n    private static final String GROUP = \"group\";\n    \n    private static final String APP_NAME = \"appName\";\n    \n    private static final String CONTENT = \"content\";\n    \n    private static final String TENANT = \"tenant_id\";\n    \n    /**\n     * constant variables.\n     */\n    public static final String SPOT = \".\";\n    \n    private DataSourceService dataSourceService;\n    \n    protected JdbcTemplate jt;\n    \n    protected TransactionTemplate tjt;\n    \n    private MapperManager mapperManager;\n    \n    private HistoryConfigInfoPersistService historyConfigInfoPersistService;\n    \n    public ExternalConfigInfoPersistServiceImpl(\n            @Qualifier(\"externalHistoryConfigInfoPersistServiceImpl\") HistoryConfigInfoPersistService historyConfigInfoPersistService) {\n        this.dataSourceService = DynamicDataSource.getInstance().getDataSource();\n        this.jt = dataSourceService.getJdbcTemplate();\n        this.tjt = dataSourceService.getTransactionTemplate();\n        Boolean isDataSourceLogEnable = EnvUtil.getProperty(Constants.NACOS_PLUGIN_DATASOURCE_LOG, Boolean.class,\n                false);\n        this.mapperManager = MapperManager.instance(isDataSourceLogEnable);\n        this.historyConfigInfoPersistService = historyConfigInfoPersistService;\n    }\n    \n    @Override\n    public &lt;E&gt; PaginationHelper&lt;E&gt; createPaginationHelper() {\n        return new ExternalStoragePaginationHelperImpl&lt;&gt;(jt);\n    }\n    \n    @Override\n    public String generateLikeArgument(String s) {\n        String fuzzySearchSign = \"\\\\\\\\*\";\n        String sqlLikePercentSign = \"%\";\n        if (s.contains(PATTERN_STR)) {\n            return s.replaceAll(fuzzySearchSign, sqlLikePercentSign);\n        } else {\n            return s;\n        }\n    }\n    \n    @Override\n    public void addConfigInfo(final String srcIp, final String srcUser, final ConfigInfo configInfo,\n            final Timestamp time, final Map&lt;String, Object&gt; configAdvanceInfo, final boolean notify) {\n        boolean result = tjt.execute(status -&gt; {\n            try {\n                long configId = addConfigInfoAtomic(-1, srcIp, srcUser, configInfo, time, configAdvanceInfo);\n                String configTags = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"config_tags\");\n                addConfigTagsRelation(configId, configTags, configInfo.getDataId(), configInfo.getGroup(),\n                        configInfo.getTenant());\n                \n                historyConfigInfoPersistService.insertConfigHistoryAtomic(0, configInfo, srcIp, srcUser, time, \"I\");\n            } catch (CannotGetJdbcConnectionException e) {\n                LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n                throw e;\n            }\n            return Boolean.TRUE;\n        });\n    }\n    \n    @Override\n    public void insertOrUpdate(String srcIp, String srcUser, ConfigInfo configInfo, Timestamp time,\n            Map&lt;String, Object&gt; configAdvanceInfo) {\n        insertOrUpdate(srcIp, srcUser, configInfo, time, configAdvanceInfo, true);\n    }\n    \n    @Override\n    public void insertOrUpdate(String srcIp, String srcUser, ConfigInfo configInfo, Timestamp time,\n            Map&lt;String, Object&gt; configAdvanceInfo, boolean notify) {\n        try {\n            addConfigInfo(srcIp, srcUser, configInfo, time, configAdvanceInfo, notify);\n        } catch (DataIntegrityViolationException ive) { // Unique constraint conflict\n            updateConfigInfo(configInfo, srcIp, srcUser, time, configAdvanceInfo, notify);\n        }\n    }\n    \n    @Override\n    public boolean insertOrUpdateCas(String srcIp, String srcUser, ConfigInfo configInfo, Timestamp time,\n            Map&lt;String, Object&gt; configAdvanceInfo) {\n        return insertOrUpdateCas(srcIp, srcUser, configInfo, time, configAdvanceInfo, true);\n    }\n    \n    @Override\n    public boolean insertOrUpdateCas(String srcIp, String srcUser, ConfigInfo configInfo, Timestamp time,\n            Map&lt;String, Object&gt; configAdvanceInfo, boolean notify) {\n        try {\n            addConfigInfo(srcIp, srcUser, configInfo, time, configAdvanceInfo, notify);\n            return true;\n        } catch (DataIntegrityViolationException ive) { // Unique constraint conflict\n            return updateConfigInfoCas(configInfo, srcIp, srcUser, time, configAdvanceInfo, notify);\n        }\n    }\n    \n    @Override\n    public long addConfigInfoAtomic(final long configId, final String srcIp, final String srcUser,\n            final ConfigInfo configInfo, final Timestamp time, Map&lt;String, Object&gt; configAdvanceInfo) {\n        final String appNameTmp =\n                StringUtils.isBlank(configInfo.getAppName()) ? StringUtils.EMPTY : configInfo.getAppName();\n        final String tenantTmp =\n                StringUtils.isBlank(configInfo.getTenant()) ? StringUtils.NULL : configInfo.getTenant();\n        \n        final String desc = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"desc\");\n        final String use = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"use\");\n        final String effect = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"effect\");\n        final String type = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"type\");\n        final String schema = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"schema\");\n        final String encryptedDataKey =\n                configInfo.getEncryptedDataKey() == null ? StringUtils.EMPTY : configInfo.getEncryptedDataKey();\n        \n        final String md5Tmp = MD5Utils.md5Hex(configInfo.getContent(), Constants.ENCODE);\n        \n        KeyHolder keyHolder = new GeneratedKeyHolder();\n        \n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        Integer id = jt.queryForObject(\"select SEQ_CONFIG_INFO.nextval from dual\", Integer.class);\n        final String sql = configInfoMapper.insert(\n                Arrays.asList(\"id\", \"data_id\", \"group_id\", \"tenant_id\", \"app_name\", \"content\", \"md5\", \"src_ip\", \"src_user\",\n                        \"gmt_create\", \"gmt_modified\", \"c_desc\", \"c_use\", \"effect\", \"type\", \"c_schema\",\n                        \"encrypted_data_key\"));\n        String[] returnGeneratedKeys = configInfoMapper.getPrimaryKeyGeneratedKeys();\n        try {\n            jt.update(new PreparedStatementCreator() {\n                @Override\n                public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {\n                    PreparedStatement ps = connection.prepareStatement(sql, returnGeneratedKeys);\n                    int i = 1;\n                    ps.setInt(i++, id);\n                    ps.setString(i++, configInfo.getDataId());\n                    ps.setString(i++, configInfo.getGroup());\n                    ps.setString(i++, tenantTmp);\n                    ps.setString(i++, appNameTmp);\n                    ps.setString(i++, configInfo.getContent());\n                    ps.setString(i++, md5Tmp);\n                    ps.setString(i++, srcIp);\n                    ps.setString(i++, srcUser);\n                    ps.setTimestamp(i++, time);\n                    ps.setTimestamp(i++, time);\n                    ps.setString(i++, desc);\n                    ps.setString(i++, use);\n                    ps.setString(i++, effect);\n                    ps.setString(i++, type);\n                    ps.setString(i++, schema);\n                    ps.setString(i++, encryptedDataKey);\n                    return ps;\n                }\n            }, keyHolder);\n            Number nu = keyHolder.getKey();\n            if (nu == null) {\n                throw new IllegalArgumentException(\"insert config_info fail\");\n            }\n            return nu.longValue();\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public void addConfigTagRelationAtomic(long configId, String tagName, String dataId, String group, String tenant) {\n        try {\n            ConfigTagsRelationMapper configTagsRelationMapper = mapperManager.findMapper(\n                    dataSourceService.getDataSourceType(), TableConstant.CONFIG_TAGS_RELATION);\n            jt.update(configTagsRelationMapper.insert(\n                            Arrays.asList(\"id\", \"tag_name\", \"tag_type\", \"data_id\", \"group_id\", \"tenant_id\")), configId, tagName,\n                    StringUtils.EMPTY, dataId, group, tenant);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public void addConfigTagsRelation(long configId, String configTags, String dataId, String group, String tenant) {\n        if (StringUtils.isNotBlank(configTags)) {\n            String[] tagArr = configTags.split(\",\");\n            for (int i = 0; i &lt; tagArr.length; i++) {\n                addConfigTagRelationAtomic(configId, tagArr[i], dataId, group, tenant);\n            }\n        }\n    }\n    \n    @Override\n    public Map&lt;String, Object&gt; batchInsertOrUpdate(List&lt;ConfigAllInfo&gt; configInfoList, String srcUser, String srcIp,\n            Map&lt;String, Object&gt; configAdvanceInfo, Timestamp time, boolean notify, SameConfigPolicy policy)\n            throws NacosException {\n        int succCount = 0;\n        int skipCount = 0;\n        List&lt;Map&lt;String, String&gt;&gt; failData = null;\n        List&lt;Map&lt;String, String&gt;&gt; skipData = null;\n        \n        for (int i = 0; i &lt; configInfoList.size(); i++) {\n            ConfigAllInfo configInfo = configInfoList.get(i);\n            try {\n                ParamUtils.checkParam(configInfo.getDataId(), configInfo.getGroup(), \"datumId\",\n                        configInfo.getContent());\n            } catch (NacosException e) {\n                LogUtil.DEFAULT_LOG.error(\"data verification failed\", e);\n                throw e;\n            }\n            ConfigInfo configInfo2Save = new ConfigInfo(configInfo.getDataId(), configInfo.getGroup(),\n                    configInfo.getTenant(), configInfo.getAppName(), configInfo.getContent());\n            configInfo2Save.setEncryptedDataKey(\n                    configInfo.getEncryptedDataKey() == null ? StringUtils.EMPTY : configInfo.getEncryptedDataKey());\n            \n            String type = configInfo.getType();\n            if (StringUtils.isBlank(type)) {\n                // simple judgment of file type based on suffix\n                if (configInfo.getDataId().contains(SPOT)) {\n                    String extName = configInfo.getDataId().substring(configInfo.getDataId().lastIndexOf(SPOT) + 1);\n                    FileTypeEnum fileTypeEnum = FileTypeEnum.getFileTypeEnumByFileExtensionOrFileType(extName);\n                    type = fileTypeEnum.getFileType();\n                } else {\n                    type = FileTypeEnum.getFileTypeEnumByFileExtensionOrFileType(null).getFileType();\n                }\n            }\n            if (configAdvanceInfo == null) {\n                configAdvanceInfo = new HashMap&lt;&gt;(16);\n            }\n            configAdvanceInfo.put(\"type\", type);\n            configAdvanceInfo.put(\"desc\", configInfo.getDesc());\n            try {\n                addConfigInfo(srcIp, srcUser, configInfo2Save, time, configAdvanceInfo, notify);\n                succCount++;\n            } catch (DataIntegrityViolationException ive) {\n                // uniqueness constraint conflict\n                if (SameConfigPolicy.ABORT.equals(policy)) {\n                    failData = new ArrayList&lt;&gt;();\n                    skipData = new ArrayList&lt;&gt;();\n                    Map&lt;String, String&gt; faileditem = new HashMap&lt;&gt;(2);\n                    faileditem.put(\"dataId\", configInfo2Save.getDataId());\n                    faileditem.put(\"group\", configInfo2Save.getGroup());\n                    failData.add(faileditem);\n                    for (int j = (i + 1); j &lt; configInfoList.size(); j++) {\n                        ConfigInfo skipConfigInfo = configInfoList.get(j);\n                        Map&lt;String, String&gt; skipitem = new HashMap&lt;&gt;(2);\n                        skipitem.put(\"dataId\", skipConfigInfo.getDataId());\n                        skipitem.put(\"group\", skipConfigInfo.getGroup());\n                        skipData.add(skipitem);\n                    }\n                    break;\n                } else if (SameConfigPolicy.SKIP.equals(policy)) {\n                    skipCount++;\n                    if (skipData == null) {\n                        skipData = new ArrayList&lt;&gt;();\n                    }\n                    Map&lt;String, String&gt; skipitem = new HashMap&lt;&gt;(2);\n                    skipitem.put(\"dataId\", configInfo2Save.getDataId());\n                    skipitem.put(\"group\", configInfo2Save.getGroup());\n                    skipData.add(skipitem);\n                } else if (SameConfigPolicy.OVERWRITE.equals(policy)) {\n                    succCount++;\n                    updateConfigInfo(configInfo2Save, srcIp, srcUser, time, configAdvanceInfo, notify);\n                }\n            }\n        }\n        Map&lt;String, Object&gt; result = new HashMap&lt;&gt;(4);\n        result.put(\"succCount\", succCount);\n        result.put(\"skipCount\", skipCount);\n        if (failData != null &amp;&amp; !failData.isEmpty()) {\n            result.put(\"failData\", failData);\n        }\n        if (skipData != null &amp;&amp; !skipData.isEmpty()) {\n            result.put(\"skipData\", skipData);\n        }\n        return result;\n    }\n    \n    @Override\n    public void removeConfigInfo(final String dataId, final String group, final String tenant, final String srcIp,\n            final String srcUser) {\n        tjt.execute(new TransactionCallback&lt;Boolean&gt;() {\n            final Timestamp time = new Timestamp(System.currentTimeMillis());\n            \n            @Override\n            public Boolean doInTransaction(TransactionStatus status) {\n                try {\n                    ConfigInfo configInfo = findConfigInfo(dataId, group, tenant);\n                    if (configInfo != null) {\n                        removeConfigInfoAtomic(dataId, group, tenant, srcIp, srcUser);\n                        removeTagByIdAtomic(configInfo.getId());\n                        historyConfigInfoPersistService.insertConfigHistoryAtomic(configInfo.getId(), configInfo, srcIp,\n                                srcUser, time, \"D\");\n                    }\n                } catch (CannotGetJdbcConnectionException e) {\n                    LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n                    throw e;\n                }\n                return Boolean.TRUE;\n            }\n        });\n    }\n    \n    @Override\n    public List&lt;ConfigInfo&gt; removeConfigInfoByIds(final List&lt;Long&gt; ids, final String srcIp, final String srcUser) {\n        if (CollectionUtils.isEmpty(ids)) {\n            return null;\n        }\n        ids.removeAll(Collections.singleton(null));\n        return tjt.execute(new TransactionCallback&lt;List&lt;ConfigInfo&gt;&gt;() {\n            final Timestamp time = new Timestamp(System.currentTimeMillis());\n            \n            @Override\n            public List&lt;ConfigInfo&gt; doInTransaction(TransactionStatus status) {\n                try {\n                    String idsStr = StringUtils.join(ids, StringUtils.COMMA);\n                    List&lt;ConfigInfo&gt; configInfoList = findConfigInfosByIds(idsStr);\n                    if (!CollectionUtils.isEmpty(configInfoList)) {\n                        removeConfigInfoByIdsAtomic(idsStr);\n                        for (ConfigInfo configInfo : configInfoList) {\n                            removeTagByIdAtomic(configInfo.getId());\n                            historyConfigInfoPersistService.insertConfigHistoryAtomic(configInfo.getId(), configInfo,\n                                    srcIp, srcUser, time, \"D\");\n                        }\n                    }\n                    return configInfoList;\n                } catch (CannotGetJdbcConnectionException e) {\n                    LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n                    throw e;\n                }\n            }\n        });\n    }\n    \n    @Override\n    public void removeTagByIdAtomic(long id) {\n        try {\n            ConfigTagsRelationMapper configTagsRelationMapper = mapperManager.findMapper(\n                    dataSourceService.getDataSourceType(), TableConstant.CONFIG_TAGS_RELATION);\n            jt.update(configTagsRelationMapper.delete(Arrays.asList(\"id\")), id);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public void removeConfigInfoAtomic(final String dataId, final String group, final String tenant, final String srcIp,\n            final String srcUser) {\n        String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        try {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            jt.update(configInfoMapper.delete(Arrays.asList(\"data_id\", \"group_id\", \"tenant_id\")), dataId, group,\n                    tenantTmp);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public void removeConfigInfoByIdsAtomic(final String ids) {\n        if (StringUtils.isBlank(ids)) {\n            return;\n        }\n        List&lt;Long&gt; paramList = new ArrayList&lt;&gt;();\n        String[] tagArr = ids.split(\",\");\n        for (String s : tagArr) {\n            paramList.add(Long.parseLong(s));\n        }\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        String sql = configInfoMapper.removeConfigInfoByIdsAtomic(paramList.size());\n        try {\n            jt.update(sql, paramList.toArray());\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public void updateConfigInfo(final ConfigInfo configInfo, final String srcIp, final String srcUser,\n            final Timestamp time, final Map&lt;String, Object&gt; configAdvanceInfo, final boolean notify) {\n        boolean result = tjt.execute(status -&gt; {\n            try {\n                ConfigInfo oldConfigInfo = findConfigInfo(configInfo.getDataId(), configInfo.getGroup(),\n                        configInfo.getTenant());\n                String appNameTmp = oldConfigInfo.getAppName();\n                /*\n                 If the appName passed by the user is not empty, use the persistent user\'s appName,\n                 otherwise use db; when emptying appName, you need to pass an empty string\n                 */\n                if (configInfo.getAppName() == null) {\n                    configInfo.setAppName(appNameTmp);\n                }\n                updateConfigInfoAtomic(configInfo, srcIp, srcUser, time, configAdvanceInfo);\n                String configTags = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"config_tags\");\n                if (configTags != null) {\n                    // delete all tags and then recreate\n                    removeTagByIdAtomic(oldConfigInfo.getId());\n                    addConfigTagsRelation(oldConfigInfo.getId(), configTags, configInfo.getDataId(),\n                            configInfo.getGroup(), configInfo.getTenant());\n                }\n                historyConfigInfoPersistService.insertConfigHistoryAtomic(oldConfigInfo.getId(), oldConfigInfo, srcIp,\n                        srcUser, time, \"U\");\n            } catch (CannotGetJdbcConnectionException e) {\n                LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n                throw e;\n            }\n            return Boolean.TRUE;\n        });\n    }\n    \n    @Override\n    public boolean updateConfigInfoCas(final ConfigInfo configInfo, final String srcIp, final String srcUser,\n            final Timestamp time, final Map&lt;String, Object&gt; configAdvanceInfo, final boolean notify) {\n        return tjt.execute(status -&gt; {\n            try {\n                ConfigInfo oldConfigInfo = findConfigInfo(configInfo.getDataId(), configInfo.getGroup(),\n                        configInfo.getTenant());\n                String appNameTmp = oldConfigInfo.getAppName();\n                /*\n                 If the appName passed by the user is not empty, use the persistent user\'s appName,\n                 otherwise use db; when emptying appName, you need to pass an empty string\n                 */\n                if (configInfo.getAppName() == null) {\n                    configInfo.setAppName(appNameTmp);\n                }\n                int rows = updateConfigInfoAtomicCas(configInfo, srcIp, srcUser, time, configAdvanceInfo);\n                if (rows &lt; 1) {\n                    return Boolean.FALSE;\n                }\n                String configTags = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"config_tags\");\n                if (configTags != null) {\n                    // delete all tags and then recreate\n                    removeTagByIdAtomic(oldConfigInfo.getId());\n                    addConfigTagsRelation(oldConfigInfo.getId(), configTags, configInfo.getDataId(),\n                            configInfo.getGroup(), configInfo.getTenant());\n                }\n                historyConfigInfoPersistService.insertConfigHistoryAtomic(oldConfigInfo.getId(), oldConfigInfo, srcIp,\n                        srcUser, time, \"U\");\n            } catch (CannotGetJdbcConnectionException e) {\n                LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n                throw e;\n            }\n            return Boolean.TRUE;\n        });\n    }\n    \n    private int updateConfigInfoAtomicCas(final ConfigInfo configInfo, final String srcIp, final String srcUser,\n            final Timestamp time, Map&lt;String, Object&gt; configAdvanceInfo) {\n        String appNameTmp = StringUtils.isBlank(configInfo.getAppName()) ? StringUtils.EMPTY : configInfo.getAppName();\n        String tenantTmp = StringUtils.isBlank(configInfo.getTenant()) ? StringUtils.NULL : configInfo.getTenant();\n        final String md5Tmp = MD5Utils.md5Hex(configInfo.getContent(), Constants.ENCODE);\n        String desc = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"desc\");\n        String use = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"use\");\n        String effect = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"effect\");\n        String type = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"type\");\n        String schema = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"schema\");\n        \n        try {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            return jt.update(configInfoMapper.updateConfigInfoAtomicCas(), configInfo.getContent(), md5Tmp, srcIp,\n                    srcUser, time, appNameTmp, desc, use, effect, type, schema, configInfo.getDataId(),\n                    configInfo.getGroup(), tenantTmp, configInfo.getMd5());\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public void updateConfigInfoAtomic(final ConfigInfo configInfo, final String srcIp, final String srcUser,\n            final Timestamp time, Map&lt;String, Object&gt; configAdvanceInfo) {\n        String appNameTmp = StringUtils.isBlank(configInfo.getAppName()) ? StringUtils.EMPTY : configInfo.getAppName();\n        String tenantTmp = StringUtils.isBlank(configInfo.getTenant()) ? StringUtils.NULL : configInfo.getTenant();\n        final String md5Tmp = MD5Utils.md5Hex(configInfo.getContent(), Constants.ENCODE);\n        String desc = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"desc\");\n        String use = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"use\");\n        String effect = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"effect\");\n        String type = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"type\");\n        String schema = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"schema\");\n        final String encryptedDataKey =\n                configInfo.getEncryptedDataKey() == null ? StringUtils.EMPTY : configInfo.getEncryptedDataKey();\n        \n        try {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            jt.update(configInfoMapper.update(\n                            Arrays.asList(\"content\", \"md5\", \"src_ip\", \"src_user\", \"gmt_modified\", \"app_name\", \"c_desc\", \"c_use\",\n                                    \"effect\", \"type\", \"c_schema\", \"encrypted_data_key\"),\n                            Arrays.asList(\"data_id\", \"group_id\", \"tenant_id\")), configInfo.getContent(), md5Tmp, srcIp, srcUser,\n                    time, appNameTmp, desc, use, effect, type, schema, encryptedDataKey, configInfo.getDataId(),\n                    configInfo.getGroup(), tenantTmp);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public void updateMd5(String dataId, String group, String tenant, String md5, Timestamp lastTime) {\n        String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        try {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            jt.update(configInfoMapper.update(Collections.singletonList(\"md5\"),\n                            Arrays.asList(\"data_id\", \"group_id\", \"tenant_id\", \"gmt_modified\")), md5, dataId, group, tenantTmp,\n                    lastTime);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public long findConfigMaxId() {\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        String sql = configInfoMapper.findConfigMaxId();\n        try {\n            return jt.queryForObject(sql, Long.class);\n        } catch (NullPointerException e) {\n            return 0;\n        }\n    }\n    \n    @Deprecated\n    @Override\n    public List&lt;ConfigInfo&gt; findAllDataIdAndGroup() {\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        String sql = configInfoMapper.findAllDataIdAndGroup();\n        \n        try {\n            return jt.query(sql, new Object[] {}, CONFIG_INFO_ROW_MAPPER);\n        } catch (EmptyResultDataAccessException e) {\n            return Collections.emptyList();\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        } catch (Exception e) {\n            LogUtil.FATAL_LOG.error(\"[db-other-error]\" + e.getMessage(), e);\n            throw new RuntimeException(e);\n        }\n    }\n    \n    @Override\n    public ConfigInfoBase findConfigInfoBase(final String dataId, final String group) {\n        try {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            return this.jt.queryForObject(configInfoMapper.select(Arrays.asList(\"id\", \"data_id\", \"group_id\", \"content\"),\n                            Arrays.asList(\"data_id\", \"group_id\", \"tenant_id\")), new Object[] {dataId, group, StringUtils.EMPTY},\n                    CONFIG_INFO_BASE_ROW_MAPPER);\n        } catch (EmptyResultDataAccessException e) { // Indicates that the data does not exist, returns null.\n            return null;\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public ConfigInfo findConfigInfo(long id) {\n        try {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            return this.jt.queryForObject(configInfoMapper.select(\n                    Arrays.asList(\"id\", \"data_id\", \"group_id\", \"tenant_id\", \"app_name\", \"content\"),\n                    Collections.singletonList(\"id\")), new Object[] {id}, CONFIG_INFO_ROW_MAPPER);\n        } catch (EmptyResultDataAccessException e) { // Indicates that the data does not exist, returns null.\n            return null;\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public ConfigInfoWrapper findConfigInfo(final String dataId, final String group, final String tenant) {\n        final String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        try {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            return this.jt.queryForObject(configInfoMapper.select(\n                            Arrays.asList(\"id\", \"data_id\", \"group_id\", \"tenant_id\", \"app_name\", \"content\", \"md5\", \"type\",\n                                    \"encrypted_data_key\"), Arrays.asList(\"data_id\", \"group_id\", \"tenant_id\")),\n                    new Object[] {dataId, group, tenantTmp}, CONFIG_INFO_WRAPPER_ROW_MAPPER);\n        } catch (EmptyResultDataAccessException e) { // Indicates that the data does not exist, returns null.\n            return null;\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public Page&lt;ConfigInfo&gt; findConfigInfo4Page(final int pageNo, final int pageSize, final String dataId,\n            final String group, final String tenant, final Map&lt;String, Object&gt; configAdvanceInfo) {\n        String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        PaginationHelper&lt;ConfigInfo&gt; helper = createPaginationHelper();\n        final String appName = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"appName\");\n        final String configTags = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"config_tags\");\n        String sql = null;\n        String sqlCount = null;\n        List&lt;String&gt; paramList = new ArrayList&lt;&gt;();\n        paramList.add(tenantTmp);\n        Map&lt;String, String&gt; paramsMap = new HashMap&lt;&gt;(16);\n        if (StringUtils.isNotBlank(dataId)) {\n            paramList.add(dataId);\n            paramsMap.put(DATA_ID, DATA_ID);\n        }\n        if (StringUtils.isNotBlank(group)) {\n            paramList.add(group);\n            paramsMap.put(GROUP, GROUP);\n        }\n        if (StringUtils.isNotBlank(appName)) {\n            paramList.add(appName);\n            paramsMap.put(APP_NAME, APP_NAME);\n        }\n        final int startRow = (pageNo - 1) * pageSize;\n        if (StringUtils.isNotBlank(configTags)) {\n            String[] tagArr = configTags.split(\",\");\n            paramList.addAll(Arrays.asList(tagArr));\n            ConfigTagsRelationMapper configTagsRelationMapper = mapperManager.findMapper(\n                    dataSourceService.getDataSourceType(), TableConstant.CONFIG_TAGS_RELATION);\n            sqlCount = configTagsRelationMapper.findConfigInfo4PageCountRows(paramsMap, tagArr.length);\n            sql = configTagsRelationMapper.findConfigInfo4PageFetchRows(paramsMap, tagArr.length, startRow,\n                    pageSize);\n        } else {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            sqlCount = configInfoMapper.findConfigInfo4PageCountRows(paramsMap);\n            sql = configInfoMapper.findConfigInfo4PageFetchRows(paramsMap, startRow, pageSize);\n        }\n        try {\n            Page&lt;ConfigInfo&gt; page = helper.fetchPage(sqlCount, sql, paramList.toArray(), pageNo, pageSize,\n                    CONFIG_INFO_ROW_MAPPER);\n            for (ConfigInfo configInfo : page.getPageItems()) {\n                Pair&lt;String, String&gt; pair = EncryptionHandler.decryptHandler(configInfo.getDataId(),\n                        configInfo.getEncryptedDataKey(), configInfo.getContent());\n                configInfo.setContent(pair.getSecond());\n            }\n            return page;\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \", e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public Page&lt;ConfigInfo&gt; findConfigInfoByApp(final int pageNo, final int pageSize, final String tenant,\n            final String appName) {\n        String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        PaginationHelper&lt;ConfigInfo&gt; helper = createPaginationHelper();\n        try {\n            final int startRow = (pageNo - 1) * pageSize;\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            return helper.fetchPage(configInfoMapper.findConfigInfoByAppCountRows(),\n                    configInfoMapper.findConfigInfoByAppFetchRows(startRow, pageSize),\n                    new Object[] {generateLikeArgument(tenantTmp), appName}, pageNo, pageSize, CONFIG_INFO_ROW_MAPPER);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public Page&lt;ConfigInfoBase&gt; findConfigInfoBaseByGroup(final int pageNo, final int pageSize, final String group) {\n        PaginationHelper&lt;ConfigInfoBase&gt; helper = createPaginationHelper();\n        try {\n            final int startRow = (pageNo - 1) * pageSize;\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            return helper.fetchPage(configInfoMapper.count(Arrays.asList(\"group_id\", \"tenant_id\")),\n                    configInfoMapper.findConfigInfoBaseByGroupFetchRows(startRow, pageSize),\n                    new Object[] {group, StringUtils.EMPTY}, pageNo, pageSize, CONFIG_INFO_BASE_ROW_MAPPER);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public int configInfoCount() {\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        String sql = configInfoMapper.count(null);\n        Integer result = jt.queryForObject(sql, Integer.class);\n        if (result == null) {\n            throw new IllegalArgumentException(\"configInfoCount error\");\n        }\n        return result.intValue();\n    }\n    \n    @Override\n    public int configInfoCount(String tenant) {\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        String sql = configInfoMapper.configInfoLikeTenantCount();\n        Integer result = jt.queryForObject(sql, new Object[] {tenant}, Integer.class);\n        if (result == null) {\n            throw new IllegalArgumentException(\"configInfoCount error\");\n        }\n        return result.intValue();\n    }\n    \n    @Override\n    public List&lt;String&gt; getTenantIdList(int page, int pageSize) {\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        int from = (page - 1) * pageSize;\n        String sql = configInfoMapper.getTenantIdList(from, pageSize);\n        return jt.queryForList(sql, String.class);\n    }\n    \n    @Override\n    public List&lt;String&gt; getGroupIdList(int page, int pageSize) {\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        int from = (page - 1) * pageSize;\n        String sql = configInfoMapper.getGroupIdList(from, pageSize);\n        return jt.queryForList(sql, String.class);\n    }\n    \n    @Override\n    public Page&lt;ConfigInfo&gt; findAllConfigInfo(final int pageNo, final int pageSize, final String tenant) {\n        String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        final int startRow = (pageNo - 1) * pageSize;\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        String sqlCountRows = configInfoMapper.count(null);\n        String sqlFetchRows = configInfoMapper.findAllConfigInfoFetchRows(startRow, pageSize);\n        \n        PaginationHelper&lt;ConfigInfo&gt; helper = createPaginationHelper();\n        try {\n            return helper.fetchPageLimit(sqlCountRows, sqlFetchRows,\n                    new Object[] {generateLikeArgument(tenantTmp), (pageNo - 1) * pageSize, pageSize}, pageNo, pageSize,\n                    CONFIG_INFO_ROW_MAPPER);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public Page&lt;ConfigKey&gt; findAllConfigKey(final int pageNo, final int pageSize, final String tenant) {\n        String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        int startRow = (pageNo - 1) * pageSize;\n        String select = configInfoMapper.findAllConfigKey(startRow, pageSize);\n        \n        final int totalCount = configInfoCount(tenant);\n        int pageCount = totalCount / pageSize;\n        if (totalCount &gt; pageSize * pageCount) {\n            pageCount++;\n        }\n        \n        if (pageNo &gt; pageCount) {\n            return null;\n        }\n        \n        final Page&lt;ConfigKey&gt; page = new Page&lt;&gt;();\n        page.setPageNumber(pageNo);\n        page.setPagesAvailable(pageCount);\n        page.setTotalCount(totalCount);\n        \n        try {\n            List&lt;ConfigKey&gt; result = jt.query(select, new Object[] {generateLikeArgument(tenantTmp)},\n                    // new Object[0],\n                    CONFIG_KEY_ROW_MAPPER);\n            \n            for (ConfigKey item : result) {\n                page.getPageItems().add(item);\n            }\n            return page;\n        } catch (EmptyResultDataAccessException e) {\n            return page;\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public Page&lt;ConfigInfoWrapper&gt; findAllConfigInfoFragment(final long lastMaxId, final int pageSize) {\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        String select = configInfoMapper.findAllConfigInfoFragment(0, pageSize);\n        PaginationHelper&lt;ConfigInfoWrapper&gt; helper = createPaginationHelper();\n        try {\n            return helper.fetchPageLimit(select, new Object[] {lastMaxId}, 1, pageSize, CONFIG_INFO_WRAPPER_ROW_MAPPER);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public Page&lt;ConfigInfo&gt; findConfigInfoLike(final int pageNo, final int pageSize, final ConfigKey[] configKeys,\n            final boolean blacklist) {\n        String sqlCountRows = \"SELECT count(*) FROM config_info WHERE \";\n        String sqlFetchRows = \"SELECT id,data_id,group_id,tenant_id,app_name,content FROM config_info WHERE \";\n        StringBuilder where = new StringBuilder(\" 1=1 \");\n        // Whitelist, please leave the synchronization condition empty, there is no configuration that meets the conditions\n        if (configKeys.length == 0 &amp;&amp; blacklist == false) {\n            Page&lt;ConfigInfo&gt; page = new Page&lt;&gt;();\n            page.setTotalCount(0);\n            return page;\n        }\n        PaginationHelper&lt;ConfigInfo&gt; helper = createPaginationHelper();\n        List&lt;String&gt; params = new ArrayList&lt;&gt;();\n        boolean isFirst = true;\n        for (ConfigKey configInfo : configKeys) {\n            String dataId = configInfo.getDataId();\n            String group = configInfo.getGroup();\n            String appName = configInfo.getAppName();\n            \n            if (StringUtils.isBlank(dataId) &amp;&amp; StringUtils.isBlank(group) &amp;&amp; StringUtils.isBlank(appName)) {\n                break;\n            }\n            \n            if (blacklist) {\n                if (isFirst) {\n                    isFirst = false;\n                    where.append(\" AND \");\n                } else {\n                    where.append(\" AND \");\n                }\n                \n                where.append(\'(\');\n                boolean isFirstSub = true;\n                if (!StringUtils.isBlank(dataId)) {\n                    where.append(\" data_id NOT LIKE ? \");\n                    params.add(generateLikeArgument(dataId));\n                    isFirstSub = false;\n                }\n                if (!StringUtils.isBlank(group)) {\n                    if (!isFirstSub) {\n                        where.append(\" OR \");\n                    }\n                    where.append(\" group_id NOT LIKE ? \");\n                    params.add(generateLikeArgument(group));\n                    isFirstSub = false;\n                }\n                if (!StringUtils.isBlank(appName)) {\n                    if (!isFirstSub) {\n                        where.append(\" OR \");\n                    }\n                    where.append(\" app_name != ? \");\n                    params.add(appName);\n                    isFirstSub = false;\n                }\n                where.append(\") \");\n            } else {\n                if (isFirst) {\n                    isFirst = false;\n                    where.append(\" AND \");\n                } else {\n                    where.append(\" OR \");\n                }\n                where.append(\'(\');\n                boolean isFirstSub = true;\n                if (!StringUtils.isBlank(dataId)) {\n                    where.append(\" data_id LIKE ? \");\n                    params.add(generateLikeArgument(dataId));\n                    isFirstSub = false;\n                }\n                if (!StringUtils.isBlank(group)) {\n                    if (!isFirstSub) {\n                        where.append(\" AND \");\n                    }\n                    where.append(\" group_id LIKE ? \");\n                    params.add(generateLikeArgument(group));\n                    isFirstSub = false;\n                }\n                if (!StringUtils.isBlank(appName)) {\n                    if (!isFirstSub) {\n                        where.append(\" AND \");\n                    }\n                    where.append(\" app_name = ? \");\n                    params.add(appName);\n                    isFirstSub = false;\n                }\n                where.append(\") \");\n            }\n        }\n        \n        try {\n            return helper.fetchPage(sqlCountRows + where, sqlFetchRows + where, params.toArray(), pageNo, pageSize,\n                    CONFIG_INFO_ROW_MAPPER);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public Page&lt;ConfigInfo&gt; findConfigInfoLike4Page(final int pageNo, final int pageSize, final String dataId,\n            final String group, final String tenant, final Map&lt;String, Object&gt; configAdvanceInfo) {\n        String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        final String appName = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"appName\");\n        final String content = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"content\");\n        final String configTags = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get(\"config_tags\");\n        PaginationHelper&lt;ConfigInfo&gt; helper = createPaginationHelper();\n        String sqlCountRows = null;\n        String sqlFetchRows = null;\n        Map&lt;String, String&gt; paramsMap = new HashMap&lt;&gt;(16);\n        \n        List&lt;String&gt; params = new ArrayList&lt;&gt;();\n        params.add(generateLikeArgument(tenantTmp));\n        if (!StringUtils.isBlank(dataId)) {\n            params.add(generateLikeArgument(dataId));\n            paramsMap.put(DATA_ID, DATA_ID);\n        }\n        if (!StringUtils.isBlank(group)) {\n            params.add(generateLikeArgument(group));\n            paramsMap.put(GROUP, GROUP);\n        }\n        if (!StringUtils.isBlank(appName)) {\n            params.add(appName);\n            paramsMap.put(APP_NAME, APP_NAME);\n        }\n        if (!StringUtils.isBlank(content)) {\n            params.add(generateLikeArgument(content));\n            paramsMap.put(CONTENT, CONTENT);\n        }\n        final int startRow = (pageNo - 1) * pageSize;\n        if (StringUtils.isNotBlank(configTags)) {\n            String[] tagArr = configTags.split(\",\");\n            params.addAll(Arrays.asList(tagArr));\n            ConfigTagsRelationMapper configTagsRelationMapper = mapperManager.findMapper(\n                    dataSourceService.getDataSourceType(), TableConstant.CONFIG_TAGS_RELATION);\n            sqlCountRows = configTagsRelationMapper.findConfigInfoLike4PageCountRows(paramsMap, tagArr.length);\n            sqlFetchRows = configTagsRelationMapper.findConfigInfoLike4PageFetchRows(paramsMap, tagArr.length, startRow,\n                    pageSize);\n        } else {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            sqlCountRows = configInfoMapper.findConfigInfoLike4PageCountRows(paramsMap);\n            sqlFetchRows = configInfoMapper.findConfigInfoLike4PageFetchRows(paramsMap, startRow, pageSize);\n        }\n        \n        try {\n            Page&lt;ConfigInfo&gt; page = helper.fetchPage(sqlCountRows, sqlFetchRows, params.toArray(), pageNo, pageSize,\n                    CONFIG_INFO_ROW_MAPPER);\n            \n            for (ConfigInfo configInfo : page.getPageItems()) {\n                Pair&lt;String, String&gt; pair = EncryptionHandler.decryptHandler(configInfo.getDataId(),\n                        configInfo.getEncryptedDataKey(), configInfo.getContent());\n                configInfo.setContent(pair.getSecond());\n            }\n            return page;\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public Page&lt;ConfigInfoBase&gt; findConfigInfoBaseLike(final int pageNo, final int pageSize, final String dataId,\n            final String group, final String content) throws IOException {\n        if (StringUtils.isBlank(dataId) &amp;&amp; StringUtils.isBlank(group)) {\n            throw new IOException(\"invalid param\");\n        }\n        \n        PaginationHelper&lt;ConfigInfoBase&gt; helper = createPaginationHelper();\n        Map&lt;String, String&gt; paramsMap = new HashMap&lt;&gt;(16);\n        List&lt;String&gt; params = new ArrayList&lt;&gt;();\n        \n        if (!StringUtils.isBlank(dataId)) {\n            params.add(generateLikeArgument(dataId));\n            paramsMap.put(DATA_ID, DATA_ID);\n        }\n        if (!StringUtils.isBlank(group)) {\n            params.add(generateLikeArgument(group));\n            paramsMap.put(GROUP, GROUP);\n        }\n        if (!StringUtils.isBlank(content)) {\n            params.add(generateLikeArgument(content));\n            paramsMap.put(CONTENT, CONTENT);\n        }\n        \n        final int startRow = (pageNo - 1) * pageSize;\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        String sqlCountRows = configInfoMapper.findConfigInfoBaseLikeCountRows(paramsMap);\n        String sqlFetchRows = configInfoMapper.findConfigInfoBaseLikeFetchRows(paramsMap, startRow, pageSize);\n        \n        try {\n            return helper.fetchPage(sqlCountRows, sqlFetchRows, params.toArray(), pageNo, pageSize,\n                    CONFIG_INFO_BASE_ROW_MAPPER);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public List&lt;ConfigInfoWrapper&gt; findChangeConfig(final Timestamp startTime, final Timestamp endTime) {\n        try {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            List&lt;Map&lt;String, Object&gt;&gt; list = jt.queryForList(configInfoMapper.findChangeConfig(),\n                    new Object[] {startTime, endTime});\n            return convertChangeConfig(list);\n        } catch (DataAccessException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public Page&lt;ConfigInfoWrapper&gt; findChangeConfig(final String dataId, final String group, final String tenant,\n            final String appName, final Timestamp startTime, final Timestamp endTime, final int pageNo,\n            final int pageSize, final long lastMaxId) {\n        String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        Map&lt;String, String&gt; paramsMap = new HashMap&lt;&gt;(16);\n        List&lt;Object&gt; params = new ArrayList&lt;&gt;();\n        if (!StringUtils.isBlank(dataId)) {\n            params.add(generateLikeArgument(dataId));\n            paramsMap.put(DATA_ID, DATA_ID);\n        }\n        if (!StringUtils.isBlank(group)) {\n            params.add(generateLikeArgument(group));\n            paramsMap.put(GROUP, GROUP);\n        }\n        \n        if (!StringUtils.isBlank(tenantTmp)) {\n            params.add(tenantTmp);\n            paramsMap.put(TENANT, TENANT);\n        }\n        \n        if (!StringUtils.isBlank(appName)) {\n            params.add(appName);\n            paramsMap.put(APP_NAME, APP_NAME);\n        }\n        if (startTime != null) {\n            params.add(startTime);\n        }\n        if (endTime != null) {\n            params.add(endTime);\n        }\n        final int startRow = (pageNo - 1) * pageSize;\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        String sqlCountRows = configInfoMapper.findChangeConfigCountRows(paramsMap, startTime, endTime);\n        String sqlFetchRows = configInfoMapper.findChangeConfigFetchRows(paramsMap, startTime, endTime, startRow,\n                pageSize, lastMaxId);\n        \n        PaginationHelper&lt;ConfigInfoWrapper&gt; helper = createPaginationHelper();\n        try {\n            return helper.fetchPage(sqlCountRows, sqlFetchRows, params.toArray(), pageNo, pageSize, lastMaxId,\n                    CONFIG_INFO_WRAPPER_ROW_MAPPER);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public List&lt;String&gt; selectTagByConfig(String dataId, String group, String tenant) {\n        ConfigTagsRelationMapper configTagsRelationMapper = mapperManager.findMapper(\n                dataSourceService.getDataSourceType(), TableConstant.CONFIG_TAGS_RELATION);\n        String sql = configTagsRelationMapper.select(Arrays.asList(\"tag_name\"),\n                Arrays.asList(\"data_id\", \"group_id\", \"tenant_id\"));\n        try {\n            return jt.queryForList(sql, new Object[] {dataId, group, tenant}, String.class);\n        } catch (EmptyResultDataAccessException e) {\n            return null;\n        } catch (IncorrectResultSizeDataAccessException e) {\n            return null;\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public List&lt;ConfigInfo&gt; findConfigInfosByIds(final String ids) {\n        if (StringUtils.isBlank(ids)) {\n            return null;\n        }\n        List&lt;Long&gt; paramList = new ArrayList&lt;&gt;();\n        String[] tagArr = ids.split(\",\");\n        for (int i = 0; i &lt; tagArr.length; i++) {\n            paramList.add(Long.parseLong(tagArr[i]));\n        }\n        try {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            return this.jt.query(configInfoMapper.findConfigInfosByIds(tagArr.length), paramList.toArray(),\n                    CONFIG_INFO_ROW_MAPPER);\n        } catch (EmptyResultDataAccessException e) { // Indicates that the data does not exist, returns null\n            return null;\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public ConfigAdvanceInfo findConfigAdvanceInfo(final String dataId, final String group, final String tenant) {\n        final String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        try {\n            List&lt;String&gt; configTagList = this.selectTagByConfig(dataId, group, tenant);\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            ConfigAdvanceInfo configAdvance = this.jt.queryForObject(configInfoMapper.select(\n                            Arrays.asList(\"gmt_create\", \"gmt_modified\", \"src_user\", \"src_ip\", \"c_desc\", \"c_use\", \"effect\",\n                                    \"type\", \"c_schema\"), Arrays.asList(\"data_id\", \"group_id\", \"tenant_id\")),\n                    new Object[] {dataId, group, tenantTmp}, CONFIG_ADVANCE_INFO_ROW_MAPPER);\n            if (configTagList != null &amp;&amp; !configTagList.isEmpty()) {\n                StringBuilder configTagsTmp = new StringBuilder();\n                for (String configTag : configTagList) {\n                    if (configTagsTmp.length() == 0) {\n                        configTagsTmp.append(configTag);\n                    } else {\n                        configTagsTmp.append(\',\').append(configTag);\n                    }\n                }\n                configAdvance.setConfigTags(configTagsTmp.toString());\n            }\n            return configAdvance;\n        } catch (EmptyResultDataAccessException e) { // Indicates that the data does not exist, returns null\n            return null;\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public ConfigAllInfo findConfigAllInfo(final String dataId, final String group, final String tenant) {\n        final String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        try {\n            List&lt;String&gt; configTagList = this.selectTagByConfig(dataId, group, tenant);\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            ConfigAllInfo configAdvance = this.jt.queryForObject(configInfoMapper.select(\n                            Arrays.asList(\"id\", \"data_id\", \"group_id\", \"tenant_id\", \"app_name\", \"content\", \"md5\", \"gmt_create\",\n                                    \"gmt_modified\", \"src_user\", \"src_ip\", \"c_desc\", \"c_use\", \"effect\", \"type\", \"c_schema\",\n                                    \"encrypted_data_key\"), Arrays.asList(\"data_id\", \"group_id\", \"tenant_id\")),\n                    new Object[] {dataId, group, tenantTmp}, CONFIG_ALL_INFO_ROW_MAPPER);\n            if (configTagList != null &amp;&amp; !configTagList.isEmpty()) {\n                StringBuilder configTagsTmp = new StringBuilder();\n                for (String configTag : configTagList) {\n                    if (configTagsTmp.length() == 0) {\n                        configTagsTmp.append(configTag);\n                    } else {\n                        configTagsTmp.append(\',\').append(configTag);\n                    }\n                }\n                configAdvance.setConfigTags(configTagsTmp.toString());\n            }\n            return configAdvance;\n        } catch (EmptyResultDataAccessException e) { // Indicates that the data does not exist, returns null\n            return null;\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public List&lt;ConfigInfo&gt; convertDeletedConfig(List&lt;Map&lt;String, Object&gt;&gt; list) {\n        List&lt;ConfigInfo&gt; configs = new ArrayList&lt;&gt;();\n        for (Map&lt;String, Object&gt; map : list) {\n            String dataId = (String) map.get(\"data_id\");\n            String group = (String) map.get(\"group_id\");\n            String tenant = (String) map.get(\"tenant_id\");\n            ConfigInfo config = new ConfigInfo();\n            config.setDataId(dataId);\n            config.setGroup(group);\n            config.setTenant(tenant);\n            configs.add(config);\n        }\n        return configs;\n    }\n    \n    @Override\n    public List&lt;ConfigInfoWrapper&gt; convertChangeConfig(List&lt;Map&lt;String, Object&gt;&gt; list) {\n        List&lt;ConfigInfoWrapper&gt; configs = new ArrayList&lt;&gt;();\n        for (Map&lt;String, Object&gt; map : list) {\n            String dataId = (String) map.get(\"data_id\");\n            String group = (String) map.get(\"group_id\");\n            String tenant = (String) map.get(\"tenant_id\");\n            String content = (String) map.get(\"content\");\n            long mTime = ((Timestamp) map.get(\"gmt_modified\")).getTime();\n            ConfigInfoWrapper config = new ConfigInfoWrapper();\n            config.setDataId(dataId);\n            config.setGroup(group);\n            config.setTenant(tenant);\n            config.setContent(content);\n            config.setLastModified(mTime);\n            configs.add(config);\n        }\n        return configs;\n    }\n    \n    @Override\n    public List&lt;ConfigInfoWrapper&gt; listAllGroupKeyMd5() {\n        final int pageSize = 10000;\n        int totalCount = configInfoCount();\n        int pageCount = (int) Math.ceil(totalCount * 1.0 / pageSize);\n        List&lt;ConfigInfoWrapper&gt; allConfigInfo = new ArrayList&lt;&gt;();\n        for (int pageNo = 1; pageNo &lt;= pageCount; pageNo++) {\n            List&lt;ConfigInfoWrapper&gt; configInfoList = listGroupKeyMd5ByPage(pageNo, pageSize);\n            allConfigInfo.addAll(configInfoList);\n        }\n        return allConfigInfo;\n    }\n    \n    @Override\n    public List&lt;ConfigInfoWrapper&gt; listGroupKeyMd5ByPage(int pageNo, int pageSize) {\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        String sqlCountRows = configInfoMapper.count(null);\n        String sqlFetchRows = configInfoMapper.listGroupKeyMd5ByPageFetchRows((pageNo - 1) * pageSize, pageSize);\n        PaginationHelper&lt;ConfigInfoWrapper&gt; helper = createPaginationHelper();\n        try {\n            Page&lt;ConfigInfoWrapper&gt; page = helper.fetchPageLimit(sqlCountRows, sqlFetchRows, new Object[] {}, pageNo,\n                    pageSize, CONFIG_INFO_WRAPPER_ROW_MAPPER);\n            \n            return page.getPageItems();\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public ConfigInfoWrapper queryConfigInfo(final String dataId, final String group, final String tenant) {\n        String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        try {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            return this.jt.queryForObject(configInfoMapper.select(\n                            Arrays.asList(\"id\", \"data_id\", \"group_id\", \"tenant_id\", \"app_name\", \"content\", \"type\",\n                                    \"gmt_modified\", \"md5\", \"encrypted_data_key\"),\n                            Arrays.asList(\"data_id\", \"group_id\", \"tenant_id\")), new Object[] {dataId, group, tenantTmp},\n                    CONFIG_INFO_WRAPPER_ROW_MAPPER);\n        } catch (EmptyResultDataAccessException e) {\n            return null;\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public List&lt;ConfigAllInfo&gt; findAllConfigInfo4Export(final String dataId, final String group, final String tenant,\n            final String appName, final List&lt;Long&gt; ids) {\n        String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        Map&lt;String, String&gt; params = new HashMap&lt;&gt;(16);\n        List&lt;Object&gt; paramList = new ArrayList&lt;&gt;();\n        if (!CollectionUtils.isEmpty(ids)) {\n            paramList.addAll(ids);\n        } else {\n            paramList.add(tenantTmp);\n            params.put(TENANT, TENANT);\n            if (!StringUtils.isBlank(dataId)) {\n                paramList.add(generateLikeArgument(dataId));\n                params.put(DATA_ID, DATA_ID);\n            }\n            if (StringUtils.isNotBlank(group)) {\n                paramList.add(group);\n                params.put(GROUP, GROUP);\n            }\n            if (StringUtils.isNotBlank(appName)) {\n                paramList.add(appName);\n                params.put(APP_NAME, APP_NAME);\n            }\n        }\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        String sql = configInfoMapper.findAllConfigInfo4Export(ids, params);\n        try {\n            return this.jt.query(sql, paramList.toArray(), CONFIG_ALL_INFO_ROW_MAPPER);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    public List&lt;ConfigInfoWrapper&gt; queryConfigInfoByNamespace(String tenant) {\n        if (Objects.isNull(tenant)) {\n            throw new IllegalArgumentException(\"tenantId can not be null\");\n        }\n        String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.NULL : tenant;\n        try {\n            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                    TableConstant.CONFIG_INFO);\n            return this.jt.query(\n                    configInfoMapper.select(Arrays.asList(\"data_id\", \"group_id\", \"tenant_id\", \"app_name\", \"type\"),\n                            Collections.singletonList(\"tenant_id\")), new Object[] {tenantTmp},\n                    CONFIG_INFO_WRAPPER_ROW_MAPPER);\n        } catch (EmptyResultDataAccessException e) { // Indicates that the data does not exist, returns null.\n            return Collections.EMPTY_LIST;\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n    \n    @Override\n    @Deprecated\n    public Page&lt;ConfigInfoBase&gt; findAllConfigInfoBase(final int pageNo, final int pageSize) {\n        final int startRow = (pageNo - 1) * pageSize;\n        ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),\n                TableConstant.CONFIG_INFO);\n        String sqlCountRows = configInfoMapper.count(null);\n        String sqlFetchRows = configInfoMapper.findAllConfigInfoBaseFetchRows(startRow, pageSize);\n        \n        PaginationHelper&lt;ConfigInfoBase&gt; helper = createPaginationHelper();\n        try {\n            return helper.fetchPageLimit(sqlCountRows, sqlFetchRows, new Object[] {(pageNo - 1) * pageSize, pageSize},\n                    pageNo, pageSize, CONFIG_INFO_BASE_ROW_MAPPER);\n        } catch (CannotGetJdbcConnectionException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n}\n</code></pre><p><strong>ExternalHistoryConfigInfoPersistServiceImpl替换方法insertConfigHistoryAtomic</strong></p><pre><code>@Override\n    public void insertConfigHistoryAtomic(long id, ConfigInfo configInfo, String srcIp, String srcUser,\n            final Timestamp time, String ops) {\n        String appNameTmp = StringUtils.isBlank(configInfo.getAppName()) ? StringUtils.EMPTY : configInfo.getAppName();\n        String tenantTmp = StringUtils.isBlank(configInfo.getTenant()) ? StringUtils.NULL : configInfo.getTenant();\n        final String md5Tmp = MD5Utils.md5Hex(configInfo.getContent(), Constants.ENCODE);\n        String encryptedDataKey = StringUtils.isBlank(configInfo.getEncryptedDataKey()) ? StringUtils.EMPTY\n                : configInfo.getEncryptedDataKey();\n        \n        try {\n            HistoryConfigInfoMapper historyConfigInfoMapper = mapperManager.findMapper(\n                    dataSourceService.getDataSourceType(), TableConstant.HIS_CONFIG_INFO);\n            Integer nid = jt.queryForObject(\"select SEQ_HIS_CONFIG_INFO.nextval from dual\", Integer.class);\n            jt.update(historyConfigInfoMapper.insert(\n                            Arrays.asList(\"id\", \"nid\", \"data_id\", \"group_id\", \"tenant_id\", \"app_name\", \"content\", \"md5\", \"src_ip\",\n                                    \"src_user\", \"gmt_create\", \"gmt_modified\", \"op_type\", \"encrypted_data_key\")), id, nid, configInfo.getDataId(),\n                    configInfo.getGroup(), tenantTmp, appNameTmp, configInfo.getContent(), md5Tmp, srcIp, srcUser, new Date(), time,\n                    ops, encryptedDataKey);\n        } catch (DataAccessException e) {\n            LogUtil.FATAL_LOG.error(\"[db-error] \" + e, e);\n            throw e;\n        }\n    }\n</code></pre><ol>\n<li><strong>nacos-datasource-plugin模块</strong></li>\n</ol><p><a href=\"http://ConfigInfoMapperByOracle.java\">ConfigInfoMapperByOracle.java</a> 类findAllConfigInfoFragment方法</p><pre><code>@Override\n    public String findAllConfigInfoFragment(int startRow, int pageSize) {\n        return \"SELECT * FROM (SELECT id,data_id,group_id,tenant_id,app_name,content,md5,gmt_modified,type,encrypted_data_key \"\n                + \", ROWNUM as rnum FROM config_info WHERE id &gt; ? ORDER BY id ASC) \" + \" WHERE  rnum &gt;= \" + startRow + \" and \" + pageSize + \" &gt;= rnum \";\n    }\n</code></pre><ol>\n<li><strong>nacos-console模块</strong></li>\n</ol><p>application.properties增加</p><pre><code>nacos.plugin.datasource.log.enabled=true\nspring.sql.init.platform=oracle\ndb.num=1\ndb.user=nacos\ndb.password=orac123#\ndb.url.0=jdbc:oracle:thin:@127.0.0.1:1521/xe\ndb.jdbcDriverName=oracle.jdbc.OracleDriver\ndb.testQuery=select 1 from dual\n</code></pre><ol>\n<li><strong>nacos-plugin-default-impl模块</strong></li>\n</ol><p><strong>AuthRowMapperManager.java</strong></p><p><img src=\"https://prod-files-secure.s3.us-west-2.amazonaws.com/cd36ae31-85ee-4a44-955d-462b2bb91fcc/9ecb48f1-8511-4988-8a99-eb6d3c16dc88/796a77c7-ec99-49d1-bf2d-c7979f08dbd0.png\" alt=\"Untitled\"/></p><p><strong>ExternalPermissionPersistServiceImpl.java</strong></p><p><img src=\"https://prod-files-secure.s3.us-west-2.amazonaws.com/cd36ae31-85ee-4a44-955d-462b2bb91fcc/10ed85e5-7860-4193-802c-f15522654f71/Untitled.png\" alt=\"Untitled\"/></p><p><img src=\"https://prod-files-secure.s3.us-west-2.amazonaws.com/cd36ae31-85ee-4a44-955d-462b2bb91fcc/bd7fb496-0213-4ea8-a336-6a0b91ff0c70/Untitled.png\" alt=\"Untitled\"/></p><p><img src=\"https://prod-files-secure.s3.us-west-2.amazonaws.com/cd36ae31-85ee-4a44-955d-462b2bb91fcc/a0113a01-1df5-484a-80b3-6928ab25414a/Untitled.png\" alt=\"Untitled\"/></p><p><img src=\"https://prod-files-secure.s3.us-west-2.amazonaws.com/cd36ae31-85ee-4a44-955d-462b2bb91fcc/b4099e62-3dc7-45eb-80ac-627ca199af8e/Untitled.png\" alt=\"Untitled\"/></p><p>nacos-oracle.sql</p><pre><code>create table CONFIG_INFO\n(\n    ID                 NUMBER(20)         not null\n        primary key,\n    DATA_ID            VARCHAR2(255 char) not null,\n    GROUP_ID           VARCHAR2(128 char),\n    CONTENT            CLOB               not null,\n    MD5                VARCHAR2(32 char),\n    GMT_CREATE         DATE               not null,\n    GMT_MODIFIED       DATE               not null,\n    SRC_USER           CLOB,\n    SRC_IP             VARCHAR2(20 char),\n    APP_NAME           VARCHAR2(128 char) default NULL,\n    TENANT_ID          VARCHAR2(128 char) default \'\',\n    C_DESC             VARCHAR2(256 char) default NULL,\n    C_USE              VARCHAR2(64 char)  default NULL,\n    EFFECT             VARCHAR2(64 char)  default NULL,\n    TYPE               VARCHAR2(64 char)  default NULL,\n    C_SCHEMA           CLOB,\n    ENCRYPTED_DATA_KEY CLOB               null\n)\n;\n\ncreate unique index UK_CONFIGINFO_DATAGROUPTENANT\n    on CONFIG_INFO (DATA_ID, GROUP_ID, TENANT_ID)\n;\n\ncreate table CONFIG_INFO_AGGR\n(\n    ID           NUMBER(20)         not null\n        primary key,\n    DATA_ID      VARCHAR2(255 char) not null,\n    GROUP_ID     VARCHAR2(128 char) not null,\n    DATUM_ID     VARCHAR2(255 char) not null,\n    CONTENT      CLOB               not null,\n    GMT_MODIFIED DATE               not null,\n    APP_NAME     VARCHAR2(128 char) default NULL,\n    TENANT_ID    VARCHAR2(128 char) default \'\'\n)\n;\n\ncreate unique index UK_C_DATAGROUPTENANTDATUM\n    on CONFIG_INFO_AGGR (DATA_ID, GROUP_ID, TENANT_ID, DATUM_ID)\n;\n\ncreate table CONFIG_INFO_BETA\n(\n    ID                 NUMBER(20)         not null\n        primary key,\n    DATA_ID            VARCHAR2(255 char) not null,\n    GROUP_ID           VARCHAR2(128 char) not null,\n    APP_NAME           VARCHAR2(128 char)  default NULL,\n    CONTENT            CLOB               not null,\n    BETA_IPS           VARCHAR2(1024 char) default NULL,\n    MD5                VARCHAR2(32 char)   default NULL,\n    GMT_CREATE         DATE               not null,\n    GMT_MODIFIED       DATE               not null,\n    SRC_USER           CLOB,\n    SRC_IP             VARCHAR2(20 char)   default NULL,\n    TENANT_ID          VARCHAR2(128 char)  default \'\',\n    ENCRYPTED_DATA_KEY CLOB               not null\n)\n;\n\ncreate unique index UK_C_DATAGROUPTENANT\n    on CONFIG_INFO_BETA (DATA_ID, GROUP_ID, TENANT_ID)\n;\n\ncreate table CONFIG_INFO_TAG\n(\n    ID           NUMBER(20)         not null\n        primary key,\n    DATA_ID      VARCHAR2(255 char) not null,\n    GROUP_ID     VARCHAR2(128 char) not null,\n    TENANT_ID    VARCHAR2(128 char) default \'\',\n    TAG_ID       VARCHAR2(128 char) not null,\n    APP_NAME     VARCHAR2(128 char) default NULL,\n    CONTENT      CLOB               not null,\n    MD5          VARCHAR2(32 char)  default NULL,\n    GMT_CREATE   DATE               not null,\n    GMT_MODIFIED DATE               not null,\n    SRC_USER     CLOB,\n    SRC_IP       VARCHAR2(20 char)  default NULL\n)\n;\n\ncreate unique index UK_C_DATAGROUPTENANTTAG\n    on CONFIG_INFO_TAG (DATA_ID, GROUP_ID, TENANT_ID, TAG_ID)\n;\n\ncreate table CONFIG_TAGS_RELATION\n(\n    ID        NUMBER(20)         not null,\n    TAG_NAME  VARCHAR2(128 char) not null,\n    TAG_TYPE  VARCHAR2(64 char)  default NULL,\n    DATA_ID   VARCHAR2(255 char) not null,\n    GROUP_ID  VARCHAR2(128 char) not null,\n    TENANT_ID VARCHAR2(128 char) default \'\',\n    NID       NUMBER(20)         not null\n        primary key\n)\n;\n\ncreate unique index UK_C_CONFIGIDTAG\n    on CONFIG_TAGS_RELATION (ID, TAG_NAME, TAG_TYPE)\n;\n\ncreate index IDX_TENANT_ID\n    on CONFIG_TAGS_RELATION (TENANT_ID)\n;\n\ncreate table GROUP_CAPACITY\n(\n    ID                NUMBER(20) not null\n        primary key,\n    GROUP_ID          VARCHAR2(128 char) default \'\',\n    QUOTA             NUMBER(10)         default \'0\',\n    USAGE             NUMBER(10)         default \'0\',\n    MAX_SIZE          NUMBER(10)         default \'0\',\n    MAX_AGGR_COUNT    NUMBER(10)         default \'0\',\n    MAX_AGGR_SIZE     NUMBER(10)         default \'0\',\n    MAX_HISTORY_COUNT NUMBER(10)         default \'0\',\n    GMT_CREATE        DATE       not null,\n    GMT_MODIFIED      DATE       not null\n)\n;\n\ncomment on table GROUP_CAPACITY is \'集群、各Group容量信息表\'\n;\n\ncomment on column GROUP_CAPACITY.ID is \'主键ID\'\n;\n\ncomment on column GROUP_CAPACITY.GROUP_ID is \'Group ID，空字符表示整个集群\'\n;\n\ncomment on column GROUP_CAPACITY.QUOTA is \'配额，0表示使用默认值\'\n;\n\ncomment on column GROUP_CAPACITY.USAGE is \'使用量\'\n;\n\ncomment on column GROUP_CAPACITY.MAX_SIZE is \'单个配置大小上限，单位为字节，0表示使用默认值\'\n;\n\ncomment on column GROUP_CAPACITY.MAX_AGGR_COUNT is \'聚合子配置最大个数，，0表示使用默认值\'\n;\n\ncomment on column GROUP_CAPACITY.MAX_AGGR_SIZE is \'单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值\'\n;\n\ncomment on column GROUP_CAPACITY.MAX_HISTORY_COUNT is \'最大变更历史数量\'\n;\n\ncomment on column GROUP_CAPACITY.GMT_CREATE is \'创建时间\'\n;\n\ncomment on column GROUP_CAPACITY.GMT_MODIFIED is \'修改时间\'\n;\n\ncreate unique index UK_GROUP_ID\n    on GROUP_CAPACITY (GROUP_ID)\n;\n\ncreate table HIS_CONFIG_INFO\n(\n    ID                 NUMBER             not null,\n    NID                NUMBER(20)         not null\n        primary key,\n    DATA_ID            VARCHAR2(255 char) not null,\n    GROUP_ID           VARCHAR2(128 char) not null,\n    APP_NAME           VARCHAR2(128 char) default NULL,\n    CONTENT            CLOB               not null,\n    MD5                VARCHAR2(32 char)  default NULL,\n    GMT_CREATE         DATE               not null,\n    GMT_MODIFIED       DATE               not null,\n    SRC_USER           CLOB,\n    SRC_IP             VARCHAR2(20 char)  default NULL,\n    OP_TYPE            CHAR(10 char)      default NULL,\n    TENANT_ID          VARCHAR2(128 char) default \'\',\n    ENCRYPTED_DATA_KEY CLOB                null\n)\n;\n\ncreate index IDX_GMT_CREATE\n    on HIS_CONFIG_INFO (GMT_CREATE)\n;\n\ncreate index IDX_GMT_MODIFIED\n    on HIS_CONFIG_INFO (GMT_MODIFIED)\n;\n\ncreate index IDX_DID\n    on HIS_CONFIG_INFO (DATA_ID)\n;\n\ncreate table TENANT_CAPACITY\n(\n    ID                NUMBER(20) not null\n        primary key,\n    TENANT_ID         VARCHAR2(128) default \'\',\n    QUOTA             NUMBER(10)    default \'0\',\n    USAGE             NUMBER(10)    default \'0\',\n    MAX_SIZE          NUMBER(10)    default \'0\',\n    MAX_AGGR_COUNT    NUMBER(10)    default \'0\',\n    MAX_AGGR_SIZE     NUMBER(10)    default \'0\',\n    MAX_HISTORY_COUNT NUMBER(10)    default \'0\',\n    GMT_CREATE        DATE       not null,\n    GMT_MODIFIED      DATE       not null\n)\n;\n\ncreate unique index UK_TENANT_ID\n    on TENANT_CAPACITY (TENANT_ID)\n;\n\ncreate table TENANT_INFO\n(\n    ID            NUMBER(20)    not null\n        primary key,\n    KP            VARCHAR2(128) not null,\n    TENANT_ID     VARCHAR2(128 char) default \'\',\n    TENANT_NAME   VARCHAR2(128 char) default \'\',\n    TENANT_DESC   VARCHAR2(256 char) default NULL,\n    CREATE_SOURCE VARCHAR2(32 char)  default NULL,\n    GMT_CREATE    NUMBER(20)    not null,\n    GMT_MODIFIED  NUMBER(20)    not null\n)\n;\n\ncreate unique index UK_TENANT_INFO_KPTENANTID\n    on TENANT_INFO (KP, TENANT_ID)\n;\n\ncreate table USERS\n(\n    USERNAME VARCHAR2(50 char)  not null\n        primary key,\n    PASSWORD VARCHAR2(500 char) not null,\n    ENABLED  CHAR               not null\n)\n;\n\ncreate table ROLES\n(\n    USERNAME VARCHAR2(50 char) not null,\n    ROLE     VARCHAR2(50 char) not null,\n    constraint UK_USERNAME_ROLE\n        unique (USERNAME, ROLE)\n)\n;\n\ncreate table PERMISSIONS\n(\n    ROLE       VARCHAR2(50 char)  not null,\n    RESOURCES VARCHAR2(512 char) not null,\n    ACTION     VARCHAR2(8 char)   not null,\n    constraint UK_ROLE_PERMISSION\n        unique (ROLE, RESOURCES, ACTION)\n)\n;\n\nINSERT INTO users (username, password, enabled) VALUES (\'nacos\', \'$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu\', \'1\');\n\nINSERT INTO roles (username, role) VALUES (\'nacos\', \'ROLE_ADMIN\');\n\ncreate sequence SEQ_CONFIG_INFO\n    maxvalue 999999999999\n;\n\ncreate sequence SEQ_CONFIG_INFO_AGGR\n    maxvalue 999999999999\n;\n\ncreate sequence SEQ_CONFIG_INFO_BETA\n    maxvalue 999999999999\n;\n\ncreate sequence SEQ_CONFIG_INFO_TAG\n    maxvalue 999999999999\n;\n\ncreate sequence SEQ_CONFIG_TAGS_RELATION\n    maxvalue 999999999999\n;\n\ncreate sequence SEQ_CAPACITY_ENTITY\n    maxvalue 999999999999\n;\n\ncreate sequence SEQ_HIS_CONFIG_INFO\n    maxvalue 999999999999\n;\n\ncreate sequence SEQ_TENANT_INFO\n    maxvalue 999999999999\n;\n</code></pre><p>最后执行 <code>mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true -Drat.skip=true -Dcheckstyle.skip=true clean install -U</code></p><p>打包完成</p><p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n</p><p><br/></p>',NULL,0,2,1,0,1,'Nacos修改oracle数据源','Nacos修改oracle数据源',1,'',0,'2024-03-12 11:29:53','2025-08-12 09:29:53'),(5,'欧拉系统部署1.28.2单节点集群(Containerd)',1,'','we',NULL,0,'<h1>Kubernetes介绍</h1><p>kubernetes（k8s）是2014年由Google公司基于Go语言编写的一款开源的容器集群编排系统，用于自动化容器的部署、扩缩容和管理；</p><p>kubernetes（k8s）是基于Google内部的Borg系统的特征开发的一个版本，集成了Borg系统大部分优势；</p><p>官方地址：<a href=\"https://kubernetes.io/\"></a><a href=\"https://Kubernetes.io\">https://Kubernetes.io</a></p><p>代码托管平台：<a href=\"https://github.com/Kubernetes\">https://github.com/Kubernetes</a></p><h1>kubernetes具备的功能</h1><ul>\n<li>自我修复：k8s可以监控容器的运行状况，并在发现容器出现异常时自动重启故障实例；</li>\n<li>弹性伸缩：k8s可以根据资源的使用情况自动地调整容器的副本数。例如，在高峰时段，k8s可以自动增加容器的副本数以应对更多的流量；而在低峰时段，k8s可以减少应用的副本数，节省资源；</li>\n<li>资源限额：k8s允许指定每个容器所需的CPU和内存资源，能够更好的管理容器的资源使用量；</li>\n<li>滚动升级：k8s可以在不中断服务的情况下滚动升级应用版本，确保在整个过程中仍有足够的实例在提供服务；</li>\n<li>负载均衡：k8s可以根据应用的负载情况自动分配流量，确保各个实例之间的负载均衡，避免某些实例过载导致的性能下降；</li>\n<li>服务发现：k8s可以自动发现应用的实例，并为它们分配一个统一的访问地址。这样，用户只需要知道这个统一的地址，就可以访问到应用的任意实例，而无需关心具体的实例信息；</li>\n<li>存储管理：k8s可以自动管理应用的存储资源，为应用提供持久化的数据存储。这样，在应用实例发生变化时，用户数据仍能保持一致，确保数据的持久性；</li>\n<li>密钥与配置管理：Kubernetes 允许你存储和管理敏感信息，例如：密码、令牌、证书、ssh密钥等信息进行统一管理，并共享给多个容器复用；</li>\n</ul><h1>kubernetes集群角色</h1><p>k8s集群需要建⽴在多个节点上，将多个节点组建成一个集群，然后进⾏统⼀管理，但是在k8s集群内部，这些节点⼜被划分成了两类⻆⾊：</p><ul>\n<li>一类⻆⾊为管理节点，叫Master，负责集群的所有管理工作；</li>\n<li>⼀类⻆⾊为⼯作节点，叫Node，负责运行集群中所有用户的容器应用 ；</li>\n</ul><h1>Master管理节点组件</h1><ul>\n<li>API Server：作为集群的管理入口，处理外部和内部通信，接收用户请求并处理集群内部组件之间的通信；</li>\n<li>Scheduler：作为集群资源调度计算，根据调度策略，负责将待部署的 Pods 分配到合适的 Node 节点上；</li>\n<li>Controller Manager：管理集群中的各种控制器，例如 Deployment、ReplicaSet、DaemonSet等，管理集群中的各种资源；</li>\n<li>etcd：作为集群的数据存储，保存集群的配置信息和状态信息；</li>\n</ul><h1>Node工作节点组件</h1><ul>\n<li>Kubelet：负责与 Master 节点通信，并根据 Master 节点的调度决策来创建、更新和删除 Pod，同时维护 Node 节点上的容器状态；</li>\n<li>容器运行时（如 Docker、containerd 等）：负责运行和管理容器，提供容器生命周期管理功能。例如：创建、更新、删除容器等；</li>\n<li>Kube-proxy：负责为集群内的服务实现网络代理和负载均衡，确保服务的访问性；</li>\n</ul><h1>非必须的集群插件</h1><ul>\n<li>DNS服务：严格意义上的必须插件，在k8s中，很多功能都需要用到DNS服务，例如：服务发现、负载均衡、有状态应用的访问等；</li>\n<li>Dashboard： 是k8s集群的Web管理界面；</li>\n<li>资源监控：例如metrics-server监视器，用于监控集群中资源利用率；</li>\n</ul><h1>kubernetes集群类型</h1><ul>\n<li>一主多从集群：由一台Master管理节点和多台Node工作节点组成，生产环境下Master节点存在单点故障的风险，适合学习和测试环境使用；</li>\n<li>多主多从集群：由多台Master管理节点和多Node工作节点组成，安全性高，适合生产环境使用；</li>\n</ul><h1>kubernetes集群规划</h1><p>提示：系统尽量别带图形界面，图形比较吃内存。</p><table>\n<thead>\n<tr>\n<th><strong>主机名</strong></th>\n<th><strong>IP地址</strong></th>\n<th><strong>角色</strong></th>\n<th><strong>操作系统</strong></th>\n<th><strong>硬件配置</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>master01</td>\n<td>192.168.0.10</td>\n<td>管理节点</td>\n<td>openEuler 24.03</td>\n<td>2CPU/4G内存/50G</td>\n</tr>\n<tr>\n<td>node01</td>\n<td>192.168.0.11</td>\n<td>工作节点</td>\n<td>openEuler 24.03</td>\n<td>2CPU/4G内存/50G</td>\n</tr>\n<tr>\n<td>node02</td>\n<td>192.168.0.12</td>\n<td>工作节点</td>\n<td>openEuler 24.03</td>\n<td>2CPU/4G内存/50G</td>\n</tr>\n</tbody>\n</table><p>提示：系统提前关闭防火墙与 SELinux</p><pre><code>systemctl stop firewalld &amp;&amp; systemctl disable firewalld\n</code></pre><pre><code>setenforce 0 &amp;&amp; \\\\\nsed -i \"s/SELINUX=enforcing/SELINUX=disabled/\" /etc/selinux/config\n</code></pre><h1>集群前期环境准备</h1><p>按照集群规划修改每个节点主机名</p><pre><code>hostnamectl set-hostname 主机名\n</code></pre><p><strong>以下前期环境准备需要在所有节点都执行</strong></p><p>配置集群之间本地解析，集群在初始化时需要能够解析主机名</p><pre><code>echo \"192.168.0.10 master\n192.168.0.11 node01\n192.168.0.12 node02\" &gt;&gt; /etc/hosts\n</code></pre><h1>开启bridge网桥过滤</h1><p>bridge(桥接) 是 Linux 系统中的一种虚拟网络设备，它充当一个虚拟的交换机，为集群内的容器提供网络通信功能，容器就可以通过这个 bridge 与其他容器或外部网络通信了。</p><pre><code>cat &gt; /etc/sysctl.d/k8s.conf &lt;&lt;EOF\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1\nEOF\n</code></pre><ul>\n<li>\n<p><strong>参数解释：</strong></p>\n<p>net.bridge.bridge-nf-call-ip6tables = 1  //对网桥上的IPv6数据包通过iptables处理</p>\n<p>net.bridge.bridge-nf-call-iptables = 1   //对网桥上的IPv4数据包通过iptables处理</p>\n<p>net.ipv4.ip_forward = 1                         //开启IPv4路由转发,来实现集群中的容器与外部网络的通信</p>\n</li>\n</ul><p>由于开启bridge功能，需要加载br_netfilter模块来允许在bridge设备上的数据包经过iptables防火墙处理</p><pre><code>modprobe br_netfilter &amp;&amp; lsmod | grep br_netfilter\n</code></pre><ul>\n<li>\n<p><strong>命令解释：</strong></p>\n<p>modprobe       	 //命令可以加载内核模块</p>\n<p>br_netfilter    		//模块模块允许在bridge设备上的数据包经过iptables防火墙处理</p>\n</li>\n</ul><p>加载配置文件，使上述配置生效</p><pre><code>sysctl -p /etc/sysctl.d/k8s.conf\n</code></pre><h1>关闭SWAP交换分区</h1><p>为了保证 kubelet 正常工作，k8s强制要求禁用，否则集群初始化失败</p><pre><code>swapoff -a &amp;&amp; \\\\\nsed -ri \'s/.*swap.*/#&amp;/\' /etc/fstab\n</code></pre><h1>安装Containerd软件包</h1><p>添加华为 云docker-ce仓库（containerd软件包在docker仓库）</p><pre><code>cat &lt;&lt;EOF | sudo tee /etc/yum.repos.d/docker-ce.repo &gt; /dev/null\n[docker-ce-stable]\nname=Docker CE Stable - \\\\$basearch\nbaseurl=https://mirrors.huaweicloud.com/docker-ce/linux/centos/9/\\\\$basearch/stable\nenabled=1\ngpgcheck=1\ngpgkey=https://mirrors.huaweicloud.com/docker-ce/linux/centos/gpg\nEOF\n</code></pre><p>安装containerd软件包</p><pre><code>dnf install -y containerd.io-1.6.20-3.1.el9.x86_64\n</code></pre><h1>生成containerd配置文件</h1><pre><code>containerd config default | tee /etc/containerd/config.toml\n</code></pre><p>启用Cgroup用于限制进程的资源使用量，如CPU、内存资源</p><pre><code>sed -i \'s#SystemdCgroup = false#SystemdCgroup = true#\' /etc/containerd/config.toml\n</code></pre><h1>替换文件中pause镜像的下载地址为阿里云仓库</h1><pre><code>sed -i \'s#sandbox_image = \"registry.k8s.io/pause:3.6\"#sandbox_image = \"registry.aliyuncs.com/google_containers/pause:3.9\"#\' /etc/containerd/config.toml\n</code></pre><p><strong>为Containerd配置镜像加速器，在文件中找到\n[plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors]\n，在下方添加镜像加速器</strong></p><pre><code>#...\n      [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors]\n        [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"docker.io\"]\n           endpoint = [\"&lt;https://abde64ba3c6d4242b9d12854789018c6.mirror.swr.myhuaweicloud.com&gt;\"]\n</code></pre><p><strong>指定contaienrd接口文件地址，在k8s环境中，kubelet通过\ncontainerd.sock\n文件与containerd进行通信</strong></p><pre><code>cat &lt;&lt;EOF | tee /etc/crictl.yaml\nruntime-endpoint: unix:///var/run/containerd/containerd.sock\nimage-endpoint: unix:///var/run/containerd/containerd.sock\ntimeout: 10\ndebug: false\nEOF\n</code></pre><ul>\n<li>\n<p><strong>参数解释：</strong></p>\n<p>runtime-endpoint		//指定了容器运行时的sock文件位置</p>\n<p>image-endpoint		//指定了容器镜像使用的sock文件位置</p>\n<p>timeout				//容器运行时或容器镜像服务之间的通信超时时间</p>\n<p>debug				//指定了crictl工具的调试模式,false表示调试模式未启用,true则会在输出中包含更多的调试日志信息，有助于故障排除和问题调试</p>\n</li>\n</ul><p>启动containerd并设置随机自启</p><pre><code>systemctl enable containerd --now\n</code></pre><h1>k8s集群部署方式</h1><p>kubernetes集群有多种部署方式，目前常用的部署方式有如下两种：</p><ul>\n<li>kubeadm部署方式：kubeadm是一个快速搭建kubernetes的集群工具；</li>\n<li>二进制包部署方式：从官网下载每个组件的二进制包，依次去安装，部署麻烦；</li>\n<li>其他方式：通过一些开源的工具搭建，例如：sealos；</li>\n</ul><p>配置kubeadm仓库，本实验使用阿里云 YUM源</p><pre><code>cat &gt; /etc/yum.repos.d/k8s.repo &lt;&lt;EOF\n[kubernetes]\nname=Kubernetes\nbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg &lt;https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg&gt;\nEOF\n</code></pre><p><strong>安装以下软件包：</strong></p><ul>\n<li>kubeadm：用于初始化集群，并配置集群所需的组件并生成对应的安全证书和令牌；</li>\n<li>kubelet：负责与 Master 节点通信，并根据 Master 节点的调度决策来创建、更新和删除 Pod，同时维护 Node 节点上的容器状态；</li>\n<li>kubectl：用于管理k8集群的一个命令行工具；</li>\n</ul><pre><code>yum -y install kubeadm-1.28.2 kubelet-1.28.2 kubectl-1.28.2\n</code></pre><p>kubelet启用Cgroup控制组，用于限制进程的资源使用量，如CPU、内存</p><pre><code>tee &gt; /etc/sysconfig/kubelet &lt;&lt;EOF\nKUBELET_EXTRA_ARGS=\"--cgroup-driver=systemd\"\nEOF\n</code></pre><p>设置kubelet开机自启动即可，集群初始化后自动启动</p><pre><code>systemctl enable kubelet\n</code></pre><h1>集群初始化</h1><p>在master01节点查看集群所需镜像文件</p><pre><code>kubeadm config images list\n\n#...以下是集群初始化所需的集群组件镜像\nv1.27.1; falling back to: stable-1.23\nk8s.gcr.io/kube-apiserver:v1.23.17\nk8s.gcr.io/kube-controller-manager:v1.23.17\nk8s.gcr.io/kube-scheduler:v1.23.17\nk8s.gcr.io/kube-proxy:v1.23.17\nk8s.gcr.io/pause:3.6\nk8s.gcr.io/etcd:3.5.1-0\nk8s.gcr.io/coredns/coredns:v1.8.6\n</code></pre><p>在master01节点生成初始化集群的配置文件</p><pre><code>kubeadm config print init-defaults &gt; kubeadm-config.yaml\n</code></pre><p>配置文件需要修改如下内容</p><pre><code>#管理节点的IP地址\nadvertiseAddress: 192.168.0.50\n\n#本机注册到集群后的节点名称\nname: master01\n\n#集群镜像下载地址，修改为阿里云\nimageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers\n</code></pre><p>通过配置文件初始化集群</p><pre><code>kubeadm init --config kubeadm-config.yaml\n</code></pre><ul>\n<li>\n<p>选项说明：</p>\n<p>init 				//初始化集群</p>\n<ul>\n<li>-config	//通过配置文件初始化</li>\n</ul>\n</li>\n</ul><p>根据集群初始化后的提示，执行如下命令</p><pre><code>mkdir -p $HOME/.kube\nsudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config\nsudo chown $(id -u):$(id -g) $HOME/.kube/config\n</code></pre><p>根据提示将node节点加入集群，加入成功后在master节点验证</p><pre><code>kubectl get nodes\n\nNAME     STATUS     ROLES                  AGE     VERSION\nmaster01 NotReady   control-plane,master   3m31s   v1.23.0\nnode01   NotReady   &lt;none&gt;                 12s     v1.23.0\nnode02   NotReady   &lt;none&gt;                 89s     v1.23.0\n</code></pre><p>**提示：**如果哪个节点出现问题，可以使用下列命令重置当前节点</p><pre><code>kubeadm  reset\n</code></pre><h1>部署集群网络Calico</h1><p>Calico 和 Flannel 是两种流行的 k8s 网络插件，它们都为集群中的 Pod 提供网络功能。然而，它们在实现方式和功能上有一些重要区别：</p><p><strong>网络模型的区别：</strong></p><ul>\n<li>Calico 使用 BGP（边界网关协议）作为其底层网络模型。它利用 BGP 为每个 Pod 分配一个唯一的 IP 地址，并在集群内部进行路由。Calico 支持网络策略，可以对流量进行精细控制，允许或拒绝特定的通信。</li>\n<li>Flannel 则采用了一个简化的覆盖网络模型。它为每个节点分配一个 IP 地址子网，然后在这些子网之间建立覆盖网络。Flannel 将 Pod 的数据包封装到一个更大的网络数据包中，并在节点之间进行转发。Flannel 更注重简单和易用性，不提供与 Calico 类似的网络策略功能。</li>\n</ul><p><strong>性能的区别：</strong></p><ul>\n<li>由于 Calico 使用 BGP 进行路由，其性能通常优于 Flannel。Calico 可以实现直接的 Pod 到 Pod 通信，而无需在节点之间进行额外的封装和解封装操作。这使得 Calico 在大型或高度动态的集群中具有更好的性能。</li>\n<li>Flannel 的覆盖网络模型会导致额外的封装和解封装开销，从而影响网络性能。对于较小的集群或对性能要求不高的场景，这可能并不是一个严重的问题。</li>\n</ul><p>master01节点下载Calico文件</p><pre><code>wget &lt;https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml&gt;\n</code></pre><p>创建calico网络</p><pre><code>kubectl apply -f calico.yaml\n</code></pre><p>查看Calico Pod状态是否为Running</p><pre><code>kubectl get pod -n kube-system\n\nNAME                                       READY   STATUS    RESTARTS   AGE\ncalico-kube-controllers-66966888c4-whdkj   1/1     Running   0          101s\ncalico-node-f4ghp                          1/1     Running   0          101s\ncalico-node-sj88q                          1/1     Running   0          101s\ncalico-node-vnj7f                          1/1     Running   0          101s\ncalico-node-vwnw4                          1/1     Running   0          101s\n</code></pre><h1>验证集群节点状态</h1><p>在master01节点查看集群信息</p><pre><code>kubectl get nodes\n\nNAME       STATUS   ROLES                  AGE   VERSION\nmaster01   Ready    control-plane,master   25m   v1.23.0\nnode01     Ready    &lt;none&gt;   							 25m   v1.23.0\nnode02     Ready    &lt;none&gt;   							 24m   v1.23.0\n</code></pre><h1>部署Nginx测试集群</h1><p>在master01节点部署nginx程序测试</p><pre><code>apiVersion: v1\nkind: Pod\nmetadata:\n  name: nginx\n  labels:\n    app: nginx\nspec:\n  containers:\n  - name: nginx\n    image: nginx:1.20.2\n    ports:\n    - containerPort: 80\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: nginx-svc\nspec:\n  type: NodePort\n  selector:\n    app: nginx\n  ports:\n    - name: http\n      protocol: TCP\n      port: 80\n      targetPort: 80\n      nodePort: 30002\n</code></pre><p>查看Pod状态是否为Running</p><pre><code>kubectl get pod\n\nNAME                     READY   STATUS    RESTARTS   AGE\nnginx-696649f6f9-j8zbj   1/1     Running   0          2m1s\n</code></pre><p>查看Service代理信息</p><pre><code>kubectl get service\n\nNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE\nkubernetes   ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP        44m\nnginx-svc    NodePort    10.103.195.31   &lt;none&gt;        80:30002/TCP   96s\n</code></pre><p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n</p><p>浏览器访问测试：<a href=\"http://192.168.0.30:32554/\"></a><a href=\"http://IP:3\">http://IP:3</a>0002</p>',NULL,0,5,1,0,0,'k8s','k8s',1,'',0,'2024-06-15 09:33:49','2025-08-12 09:33:49'),(6,'IBM GC日志详解',1,'','we',NULL,0,'<p>&lt;tenured freebytes=”10241336″ totalbytes=”64998400″ percent=”15″ &gt;</p><p>freebytes=”10241336″：空闲空间10241336byte</p><p>totalbytes=”64998400″：总空间大小为64998400byte</p><p>percent=”15″：空闲空间约占总空间大小的15%</p><p>&lt;soa freebytes=”9781560″ totalbytes=”64538624″ percent=”15″ /&gt;</p><p>soa：小对象分配区域；在分配对象时，首先尝试在小对象区域中进行分配。如果找不到足够大小的可用项来满足分配，并且请求的大小等于或大于64KB，那么将再次在loa中尝试分配。如果请求大小小于64KB或者loa中没有足够的连续空间，那么将触发分配故障。如果小对象区域中的可用自由空间量远远大于分配请求大小，但是还无法满足请求，则表明堆中都是碎片。</p><p>freebytes=”9781560″：空闲空间9781560byte</p><p>totalbytes=”64538624″：总空间64538624byte</p><p>percent=”15″：空闲空间约占总空间大小的15%</p><p>&lt;loa freebytes=”459776″ totalbytes=”459776″ percent=”100″ /&gt;</p><p>loa：大对象分配区域；大对象区域是堆中保留给大对象分配的一小片区域。垃圾收集器会根据loa空间的使用情况来进行扩展或收缩</p><p>freebytes=”9781560″：空闲空间9781560byte</p><p>totalbytes=”64538624″：总空间64538624byte</p><p>percent=”15″：空闲空间约占总空间大小的100%，即未使用</p><p>&lt;/tenured&gt;</p><p>&lt;pending-finalizers finalizable=”592″ reference=”5″ classloader=”0″ /&gt;</p><p>pending-finalizers：表示可终结队列的当前状态</p><p>&lt;gc type=”global” id=”26″ totalid=”26″ intervalms=”494945.222″&gt;</p><p>type=”global”：global/全局收集，另一种情况为scavenger/清扫</p><p>id=”26″：这是第26次发生全局GC</p><p>totalid=”26″：GC总共发生了26次</p><p>intervalms=”494945.222″：此次GC花费了494945.222ms</p><p>&lt;finalization objectsqueued=”592″ /&gt;</p><p>&lt;timesms mark=”95.729″ sweep=”1.073″ compact=”0.000″ total=”96.912″ /&gt;</p><p>mark=”95.729″：标记花费的时间95.729ms</p><p>sweep=”1.073″：清扫花费的时间1.073ms</p><p>compact=”0.000″：压缩花费的时间 0.000ms，未发生压缩</p><p>total=”96.912″：此次GC共花费了96.912ms</p><p>↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ GC后堆空间使用情况↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓</p><p>&lt;tenured freebytes=”22360600″ totalbytes=”64998400″ percent=”34″ &gt;</p><p>freebytes=”22360600″：空闲空间22360600byte</p><p>totalbytes=”64998400″：总空间64998400byte</p><p>percent=”34″：空闲空间约占总空间大小的34%</p><p>&lt;soa freebytes=”21966360″ totalbytes=”64604160″ percent=”34″ /&gt;</p><p>soa：小对象分配区域；</p><p>freebytes=”21966360″：空闲空间21966360byte</p><p>totalbytes=”64604160″：总空间64604160byte</p><p>percent=”34″：空闲空间约占总空间大小的34%</p><p>&lt;loa freebytes=”394240″ totalbytes=”394240″ percent=”100″ /&gt;</p><p>soa：大对象分配区域；</p><p>freebytes=”394240″：空闲空间394240byte</p><p>totalbytes=”394240″：总空间394240byte</p><p>percent=”100″：空闲空间100%</p><p>&lt;/tenured&gt;</p><p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n</p><p>&lt;/gc&gt;</p>',NULL,0,2,1,0,1,'IBM GC日志','IBM GC日志',1,'',0,'2023-01-12 02:11:07','2025-08-12 09:41:07'),(7,'ngxin网络代理转发tcp/udp',1,'','we',NULL,0,'<p>使用场景，比如有A 、B、C 3台服务器，分别在不同网段，A可以访问B，B可以访问C，但A不能访问C，只有C可以访问外网，此时在B搭建nginx转发请求至C服务器，A通过访问B的ngxin转发至C访问外网。</p><ol>\n<li>\n<p>下载对应解压包 <a href=\"https://nginx.org/download/\">https://nginx.org/download/</a> ，这里使用的是 <a href=\"https://nginx.org/download/nginx-1.10.3.tar.gz\"><strong>nginx-1.10.3.tar.gz</strong></a></p>\n</li>\n<li>\n<p>上传至目标服务器并解压 tar -xvf <a href=\"https://nginx.org/download/nginx-1.10.3.tar.gz\"><strong>nginx-1.10.3.tar.gz</strong></a></p>\n</li>\n<li>\n<p>进入解压目录  后执行</p>\n<p>./configure &nbsp; --prefix=/home/nginx/nginx（自己修改路径） --with-stream</p>\n<p>make &amp; make install</p>\n</li>\n<li>\n<p>配置tcp/udp代理，修改 nginx.conf</p>\n<pre><code>events {}\n\nhttp {}\n\nstream {\n    server {\n        listen        6464;#接收请求的端口\n        proxy_pass    ip:port;#转发的地址\n    }\n}\n</code></pre>\n</li>\n<li>\n<p>启动</p>\n<p>cd /home/nginx/nginx/sbin</p>\n<p>./nginx</p>\n</li>\n</ol><p>然后就可以正常使用ngxin进行网络转发</p>',NULL,0,2,1,0,1,'nginx实现网络代理','nginx实现网络代理',1,'',0,'2022-02-11 06:44:19','2025-08-12 09:49:34');
/*!40000 ALTER TABLE `biz_article` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `biz_article_look`
--

DROP TABLE IF EXISTS `biz_article_look`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `biz_article_look` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `article_id` bigint(20) unsigned NOT NULL COMMENT '文章ID',
  `user_id` bigint(20) unsigned DEFAULT NULL COMMENT '已登录用户ID',
  `user_ip` varchar(50) DEFAULT NULL COMMENT '用户IP',
  `look_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '浏览时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `biz_article_look`
--

LOCK TABLES `biz_article_look` WRITE;
/*!40000 ALTER TABLE `biz_article_look` DISABLE KEYS */;
INSERT INTO `biz_article_look` VALUES (2,3,NULL,'0:0:0:0:0:0:0:1','2024-09-13 14:48:15','2024-09-13 14:48:15','2024-09-13 14:48:15'),(4,3,NULL,'0:0:0:0:0:0:0:1','2024-09-13 14:51:45','2024-09-13 14:51:45','2024-09-13 14:51:45'),(5,3,NULL,'0:0:0:0:0:0:0:1','2024-09-24 10:01:09','2024-09-24 10:01:09','2024-09-24 10:01:09'),(6,3,NULL,'117.61.17.47','2025-08-11 15:11:11','2025-08-11 15:11:11','2025-08-11 15:11:11'),(7,3,NULL,'123.6.49.12','2025-08-11 15:11:36','2025-08-11 15:11:36','2025-08-11 15:11:36'),(8,3,NULL,'117.61.17.47','2025-08-11 15:14:23','2025-08-11 15:14:23','2025-08-11 15:14:23'),(9,3,NULL,'117.61.17.47','2025-08-11 15:21:23','2025-08-11 15:21:23','2025-08-11 15:21:23'),(10,4,NULL,'117.61.17.47','2025-08-12 09:30:06','2025-08-12 09:30:06','2025-08-12 09:30:06'),(11,7,NULL,'117.61.17.47','2025-08-12 09:49:08','2025-08-12 09:49:08','2025-08-12 09:49:08'),(12,3,NULL,'117.61.17.47','2025-08-12 11:00:02','2025-08-12 11:00:02','2025-08-12 11:00:02'),(13,5,NULL,'117.61.17.47','2025-08-12 11:00:17','2025-08-12 11:00:17','2025-08-12 11:00:17'),(14,5,NULL,'117.61.17.47','2025-08-12 11:00:20','2025-08-12 11:00:20','2025-08-12 11:00:20'),(15,7,NULL,'117.61.17.47','2025-08-12 11:00:23','2025-08-12 11:00:23','2025-08-12 11:00:23');
/*!40000 ALTER TABLE `biz_article_look` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `biz_article_love`
--

DROP TABLE IF EXISTS `biz_article_love`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `biz_article_love` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `article_id` bigint(20) unsigned NOT NULL COMMENT '文章ID',
  `user_id` bigint(20) unsigned DEFAULT NULL COMMENT '已登录用户ID',
  `user_ip` varchar(50) DEFAULT NULL COMMENT '用户IP',
  `love_time` datetime DEFAULT NULL COMMENT '浏览时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `biz_article_love`
--

LOCK TABLES `biz_article_love` WRITE;
/*!40000 ALTER TABLE `biz_article_love` DISABLE KEYS */;
/*!40000 ALTER TABLE `biz_article_love` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `biz_article_tags`
--

DROP TABLE IF EXISTS `biz_article_tags`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `biz_article_tags` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `tag_id` bigint(20) unsigned NOT NULL COMMENT '标签表主键',
  `article_id` bigint(20) unsigned NOT NULL COMMENT '文章ID',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `biz_article_tags`
--

LOCK TABLES `biz_article_tags` WRITE;
/*!40000 ALTER TABLE `biz_article_tags` DISABLE KEYS */;
INSERT INTO `biz_article_tags` VALUES (4,1,3,'2024-09-13 14:51:36','2024-09-13 14:51:36'),(5,2,4,'2025-08-12 09:29:53','2025-08-12 09:29:53'),(6,5,4,'2025-08-12 09:29:53','2025-08-12 09:29:53'),(7,4,4,'2025-08-12 09:29:53','2025-08-12 09:29:53'),(8,1,5,'2025-08-12 09:33:49','2025-08-12 09:33:49'),(9,5,5,'2025-08-12 09:33:49','2025-08-12 09:33:49'),(10,2,6,'2025-08-12 09:41:07','2025-08-12 09:41:07'),(11,5,7,'2025-08-12 09:44:19','2025-08-12 09:44:19');
/*!40000 ALTER TABLE `biz_article_tags` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `biz_comment`
--

DROP TABLE IF EXISTS `biz_comment`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `biz_comment` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `sid` bigint(20) DEFAULT NULL COMMENT '被评论的文章或者页面的ID',
  `user_id` bigint(20) unsigned DEFAULT NULL COMMENT '评论人的ID',
  `pid` bigint(20) unsigned DEFAULT NULL COMMENT '父级评论的id',
  `qq` varchar(13) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论人的QQ（未登录用户）',
  `nickname` varchar(13) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论人的昵称（未登录用户）',
  `avatar` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论人的头像地址',
  `email` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论人的邮箱地址（未登录用户）',
  `url` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论人的网站地址（未登录用户）',
  `status` enum('VERIFYING','APPROVED','REJECT','DELETED') COLLATE utf8mb4_unicode_ci DEFAULT 'VERIFYING' COMMENT '评论的状态',
  `ip` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论时的ip',
  `lng` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '经度',
  `lat` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '纬度',
  `address` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论时的地址',
  `os` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论时的系统类型',
  `os_short_name` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论时的系统的简称',
  `browser` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论时的浏览器类型',
  `browser_short_name` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论时的浏览器的简称',
  `content` varchar(2000) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论的内容',
  `remark` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注（审核不通过时添加）',
  `support` int(10) unsigned DEFAULT '0' COMMENT '支持（赞）',
  `oppose` int(10) unsigned DEFAULT '0' COMMENT '反对（踩）',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `biz_comment`
--

LOCK TABLES `biz_comment` WRITE;
/*!40000 ALTER TABLE `biz_comment` DISABLE KEYS */;
INSERT INTO `biz_comment` VALUES (1,1,NULL,0,'843977358','七彩狼','https://q1.qlogo.cn/g?b=qq&nk=843977358&s=40','843977358@qq.com','https://docs.zhyd.me','VERIFYING','0:0:0:0:0:0:0:1',NULL,NULL,'未知','Windows 7',NULL,'Chrome 65.0.3325.146',NULL,'<p>测试评论</p>',NULL,0,0,'2024-09-12 09:01:15','2024-09-12 09:01:15');
/*!40000 ALTER TABLE `biz_comment` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `biz_file`
--

DROP TABLE IF EXISTS `biz_file`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `biz_file` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned DEFAULT NULL,
  `storage_type` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `original_file_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `size` bigint(20) unsigned DEFAULT NULL,
  `suffix` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `width` int(10) unsigned DEFAULT NULL,
  `height` int(10) unsigned DEFAULT NULL,
  `file_path` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `full_file_path` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `file_hash` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `upload_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `upload_start_time` datetime DEFAULT NULL,
  `upload_end_time` datetime DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `biz_file`
--

LOCK TABLES `biz_file` WRITE;
/*!40000 ALTER TABLE `biz_file` DISABLE KEYS */;
INSERT INTO `biz_file` VALUES (1,1,'aliyun','1726195399678.jpg',13506,'.jpg',872,407,'oneblog/20240913140127617.jpg','nulloneblog/20240913140127617.jpg','d41d8cd98f00b204e9800998ecf8427e','oneblog/','2024-09-13 14:01:28','2024-09-13 14:01:29','2024-09-13 14:01:29','2024-09-13 14:01:29'),(2,1,'aliyun','image.png',222095,'.png',947,298,'oneblog/article/20240913144458241.png','nulloneblog/article/20240913144458241.png','d41d8cd98f00b204e9800998ecf8427e','oneblog/article/','2024-09-13 14:44:58','2024-09-13 14:45:00','2024-09-13 14:45:00','2024-09-13 14:45:00'),(3,1,'aliyun','image.png',222095,'.png',947,298,'oneblog/article/20240913144501343.png','nulloneblog/article/20240913144501343.png','d41d8cd98f00b204e9800998ecf8427e','oneblog/article/','2024-09-13 14:45:01','2024-09-13 14:45:02','2024-09-13 14:45:02','2024-09-13 14:45:02'),(4,1,'aliyun','image.png',222095,'.png',947,298,'oneblog/article/20240913144505609.png','nulloneblog/article/20240913144505609.png','d41d8cd98f00b204e9800998ecf8427e','oneblog/article/','2024-09-13 14:45:06','2024-09-13 14:45:07','2024-09-13 14:45:07','2024-09-13 14:45:07');
/*!40000 ALTER TABLE `biz_file` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `biz_page`
--

DROP TABLE IF EXISTS `biz_page`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `biz_page` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(255) DEFAULT NULL COMMENT '自定义页面的url（不包含域名部分）',
  `content` mediumtext COMMENT '自定义页面的内容',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `biz_page`
--

LOCK TABLES `biz_page` WRITE;
/*!40000 ALTER TABLE `biz_page` DISABLE KEYS */;
/*!40000 ALTER TABLE `biz_page` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `biz_tags`
--

DROP TABLE IF EXISTS `biz_tags`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `biz_tags` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL COMMENT '书签名',
  `description` varchar(100) DEFAULT NULL COMMENT '描述',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `biz_tags`
--

LOCK TABLES `biz_tags` WRITE;
/*!40000 ALTER TABLE `biz_tags` DISABLE KEYS */;
INSERT INTO `biz_tags` VALUES (1,'Linux',NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(2,'Java',NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(3,'Spring',NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(4,'Spring Boot',NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(5,'其他',NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14');
/*!40000 ALTER TABLE `biz_tags` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `biz_type`
--

DROP TABLE IF EXISTS `biz_type`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `biz_type` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `pid` bigint(20) unsigned DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL COMMENT '文章类型名',
  `description` varchar(200) DEFAULT NULL COMMENT '类型介绍',
  `sort` int(11) DEFAULT NULL COMMENT '排序',
  `icon` varchar(100) DEFAULT NULL COMMENT '图标',
  `position` varchar(10) DEFAULT NULL COMMENT '分类在web端显示的位置，可选：nav、scrollmenu',
  `available` tinyint(3) unsigned DEFAULT '1' COMMENT '是否可用',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `biz_type`
--

LOCK TABLES `biz_type` WRITE;
/*!40000 ALTER TABLE `biz_type` DISABLE KEYS */;
INSERT INTO `biz_type` VALUES (2,NULL,'后端技术','网站中记录的后端类文章，包括Java、SSM、MySQL和其他在日常工作学习中所用的后端技术',2,'fa fa-coffee','nav',1,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(3,NULL,'其他文章','记录网站建设以及日常工作、学习中的闲言碎语和个人笔记等文章',3,'fa fa-folder-open-o','nav',1,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(4,NULL,'容器技术','',NULL,'','scrollmenu',1,'2024-09-13 14:57:59','2024-09-13 14:57:59'),(5,NULL,'k8s','',NULL,'','scrollmenu',1,'2024-09-13 14:58:08','2024-09-13 14:58:08');
/*!40000 ALTER TABLE `biz_type` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `sys_config`
--

DROP TABLE IF EXISTS `sys_config`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sys_config` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `config_key` varchar(50) DEFAULT NULL COMMENT '配置关键字',
  `config_value` longtext COMMENT '配置项内容',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sys_config`
--

LOCK TABLES `sys_config` WRITE;
/*!40000 ALTER TABLE `sys_config` DISABLE KEYS */;
INSERT INTO `sys_config` VALUES (1,'homeDesc','','2024-09-12 09:01:14','2024-09-12 09:01:14'),(2,'homeKeywords','个人博客','2024-09-12 09:01:14','2024-09-12 09:01:14'),(3,'domain','8.140.246.119','2024-09-12 09:01:14','2024-09-12 09:01:14'),(4,'cmsUrl','http://8.140.246.119:8085','2024-09-12 09:01:14','2024-09-12 09:01:14'),(5,'siteUrl','http://8.140.246.119:8443','2024-09-12 09:01:14','2024-09-12 09:01:14'),(6,'siteName','个人博客','2024-09-12 09:01:14','2024-09-12 09:01:14'),(7,'siteDesc','本人十年Java工作经验，擅长各种架构后台系统开发、定位排查问题、网站搭建、环境部署等工作，有偿提供帮助。有需要提供帮助的小伙伴可以通过微信联系~','2024-09-12 09:01:14','2024-09-12 09:01:14'),(8,'siteFavicon','http://8.140.246.119:8443/img/favicon.ico','2024-09-12 09:01:14','2024-09-12 09:01:14'),(9,'staticWebSite','http://8.140.246.119:8443','2024-09-12 09:01:14','2024-09-12 09:01:14'),(10,'authorName','王宗尚','2024-09-12 09:01:14','2024-09-12 09:01:14'),(11,'authorEmail','wangzongshang@foxmail.com','2024-09-12 09:01:14','2024-09-12 09:01:14'),(12,'wxCode','https://icre.oss-cn-beijing.aliyuncs.com/wxcd.jpg','2024-09-12 09:01:14','2024-09-12 09:01:14'),(13,'qq','394254061','2024-09-12 09:01:14','2024-09-12 09:01:14'),(14,'weibo','http://weibo.com/211230415','2024-09-12 09:01:14','2024-09-12 09:01:14'),(15,'github','https://github.com/zhangyd-c','2024-09-12 09:01:14','2024-09-12 09:01:14'),(16,'maintenance','0','2024-09-12 09:01:14','2024-09-12 09:01:14'),(17,'maintenanceDate','2024-09-12 09:01:14','2024-09-12 09:01:14','2024-09-12 09:01:14'),(18,'comment','1','2024-09-12 09:01:14','2024-09-12 09:01:14'),(19,'qiniuBasePath',NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(20,'qiniuAccessKey',NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(21,'qiniuSecretKey',NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(22,'qiniuBucketName',NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(23,'baiduPushToken',NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(24,'wxPraiseCode',NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(25,'zfbPraiseCode',NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(26,'baiduApiAk','NwHaYlGalDEpgxm46xBaC3T9','2024-09-12 09:01:14','2024-09-12 09:01:14'),(27,'spiderConfig','{\r\n            imooc: {\r\n                domain: \"www.imooc.com\",\r\n                titleRegex: \"//span[@class=js-title]/html()\",\r\n                authorRegex: \"//div[@class=name_con]/p[@class=name]/a[@class=nick]/html()\",\r\n                releaseDateRegex: \"//div[@class=\'dc-profile\']/div[@class=\'l\']/span[@class=\'spacer\']/text()\",\r\n                contentRegex: \"//div[@class=detail-content]/html()\",\r\n                targetLinksRegex: \"/article/[0-9]{1,10}\",\r\n                tagRegex: \"//div[@class=cat-box]/div[@class=cat-wrap]/a[@class=cat]/html()\",\r\n                header: [\r\n                    \"Host=www.imooc.com\",\r\n                    \"Referer=https://www.imooc.com\"\r\n                ],\r\n                entryUrls: \'https://www.imooc.com/u/{uid}/articles?page={curPage}\'\r\n            },\r\n            csdn: {\r\n                domain: \"blog.csdn.net\",\r\n                titleRegex: \"//h1[@class=title-article]/html()\",\r\n                authorRegex: \"//a[@class=follow-nickName]/html()\",\r\n                releaseDateRegex: \"//div[@class=\'article-bar-top\']/span[@class=\'time\']/text()\",\r\n                contentRegex: \"//div[@class=article_content]/html()\",\r\n                targetLinksRegex: \".*blog\\\\.csdn\\\\.net/{uid}/article/details/[0-9a-zA-Z]{1,15}\",\r\n                tagRegex: \"//span[@class=artic-tag-box]/a[@class=tag-link]/html()\",\r\n                header: [\r\n                    \"Host=blog.csdn.net\",\r\n                    \"Referer=https://blog.csdn.net/{uid}/article/list/1\"\r\n                ],\r\n                entryUrls: \'https://blog.csdn.net/{uid}/article/list/{curPage}\'\r\n            },\r\n            iteye: {\r\n                domain: \"{uid}.iteye.com\",\r\n                titleRegex: \"//div[@class=blog_title]/h3/a/html()\",\r\n                authorRegex: \"//div[@id=blog_owner_name]/html()\",\r\n                releaseDateRegex: \"//div[@class=blog_bottom]/ul/li/html()\",\r\n                contentRegex: \"//div[@class=blog_content]/html()\",\r\n                targetLinksRegex: \".*{uid}\\\\.iteye\\\\.com/blog/[0-9]+\",\r\n                tagRegex: \"//div[@class=news_tag]/a/html()\",\r\n                header: [\r\n                    \"Host={uid}.iteye.com\",\r\n                    \"Referer=http://{uid}.iteye.com/\"\r\n                ],\r\n                entryUrls: \'http://{uid}.iteye.com/?page={curPage}\'\r\n            },\r\n            csblogs: {\r\n                domain: \"www.cnblogs.com\",\r\n                titleRegex: \"//a[@id=cb_post_title_url]/html()\",\r\n                authorRegex: \"//div[@class=postDesc]/a[1]/html()\",\r\n                releaseDateRegex: \"//span[@id=post-date]/html()\",\r\n                contentRegex: \"//div[@id=cnblogs_post_body]/html()\",\r\n                targetLinksRegex: \".*www\\\\.cnblogs\\\\.com/{uid}/p/[\\\\w\\\\d]+\\\\.html\",\r\n                tagRegex: \"//div[@id=EntryTag]/a/html()\",\r\n                header: [\r\n                    \"Host=www.cnblogs.com\",\r\n                    \"Referer=https://www.cnblogs.com/\"\r\n                ],\r\n                entryUrls: \'https://www.cnblogs.com/{uid}/default.html?page={curPage}\'\r\n            }\r\n        }','2024-09-12 09:01:14','2024-09-12 09:01:14'),(28,'anonymous','1','2024-09-12 09:01:14','2024-09-12 09:01:14'),(29,'editorPlaceholder','说点什么吧','2024-09-12 09:01:14','2024-09-12 09:01:14'),(30,'editorAlert','讲文明、要和谐','2024-09-12 09:01:14','2024-09-12 09:01:14'),(31,'defaultUserAvatar','[\r\n	\"http://localhost:8443/img/random/user/1.jpg\",\r\n	\"http://localhost:8443/img/random/user/2.jpg\",\r\n	\"http://localhost:8443/img/random/user/3.jpg\",\r\n	\"http://localhost:8443/img/random/user/4.jpg\",\r\n	\"http://localhost:8443/img/random/user/5.jpg\",\r\n	\"http://localhost:8443/img/random/user/6.jpg\",\r\n	\"http://localhost:8443/img/random/user/7.jpg\",\r\n	\"http://localhost:8443/img/random/user/8.jpg\",\r\n	\"http://localhost:8443/img/random/user/9.jpg\",\r\n	\"http://localhost:8443/img/random/user/10.jpg\",\r\n	\"http://localhost:8443/img/random/user/11.jpg\",\r\n	\"http://localhost:8443/img/random/user/12.jpg\",\r\n	\"http://localhost:8443/img/random/user/13.jpg\",\r\n	\"http://localhost:8443/img/random/user/14.jpg\",\r\n	\"http://localhost:8443/img/random/user/15.jpg\",\r\n	\"http://localhost:8443/img/random/user/16.jpg\",\r\n	\"http://localhost:8443/img/random/user/17.jpg\",\r\n	\"http://localhost:8443/img/random/user/18.jpg\",\r\n	\"http://localhost:8443/img/random/user/19.jpg\",\r\n	\"http://localhost:8443/img/random/user/20.jpg\"\r\n]','2024-09-12 09:01:14','2024-09-12 09:01:14'),(32,'sessionTimeOut','5','2024-09-12 09:01:14','2024-09-12 09:01:14'),(33,'sessionTimeOutUnit','MINUTES','2024-09-12 09:01:14','2024-09-12 09:01:14'),(34,'loginRetryNum','5','2024-09-12 09:01:14','2024-09-12 09:01:14'),(35,'installdate','2024-09-12 09:01:14','2024-09-12 09:01:14','2024-09-12 09:01:14'),(36,'copyright','Copyright jz0416.top','2024-09-12 09:01:14','2024-09-12 09:01:14'),(37,'dynamicTitle','您有一条新消息','2024-09-12 09:01:14','2024-09-12 09:01:14'),(38,'aliyunAccessKey','LTAI5tHfCKWanpaxZjru1zVH','2024-09-13 10:29:50','2024-09-13 10:29:50'),(39,'aliyunAccessKeySecret','edtFxifaF6zls2kderlFCI3DNm5Y4O','2024-09-13 10:29:50','2024-09-13 10:29:50'),(40,'aliyunEndpoint','https://oss-cn-beijing.aliyuncs.com','2024-09-13 10:30:00','2024-09-13 10:30:00'),(41,'storageType','aliyun','2024-09-13 13:41:58','2024-09-13 13:41:58'),(42,'aliyunBucketName','mylog111','2024-09-13 13:47:15','2024-09-13 13:47:15');
/*!40000 ALTER TABLE `sys_config` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `sys_link`
--

DROP TABLE IF EXISTS `sys_link`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sys_link` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(200) NOT NULL COMMENT '链接地址',
  `name` varchar(50) DEFAULT NULL COMMENT '链接名',
  `description` varchar(300) DEFAULT NULL COMMENT '链接介绍',
  `email` varchar(100) DEFAULT NULL COMMENT '友链站长邮箱',
  `qq` varchar(13) DEFAULT NULL COMMENT '友链站长QQ',
  `favicon` varchar(255) DEFAULT NULL,
  `status` tinyint(3) unsigned DEFAULT '1' COMMENT '状态',
  `home_page_display` tinyint(3) unsigned DEFAULT '1' COMMENT '是否首页显示',
  `remark` varchar(100) DEFAULT NULL COMMENT '备注',
  `source` enum('ADMIN','AUTOMATIC') DEFAULT 'ADMIN' COMMENT '来源：管理员添加、自动申请',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sys_link`
--

LOCK TABLES `sys_link` WRITE;
/*!40000 ALTER TABLE `sys_link` DISABLE KEYS */;
/*!40000 ALTER TABLE `sys_link` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `sys_log`
--

DROP TABLE IF EXISTS `sys_log`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sys_log` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned DEFAULT NULL COMMENT '已登录用户ID',
  `type` enum('SYSTEM','VISIT','ERROR') NOT NULL DEFAULT 'SYSTEM' COMMENT '日志类型（系统操作日志，用户访问日志，异常记录日志）',
  `log_level` enum('ERROR','WARN','INFO') NOT NULL DEFAULT 'INFO' COMMENT '日志级别',
  `content` varchar(2000) DEFAULT NULL COMMENT '日志内容（业务操作）',
  `params` varchar(2000) DEFAULT NULL COMMENT '请求参数（业务操作）',
  `spider_type` varchar(20) DEFAULT NULL COMMENT '爬虫类型（当访问者被鉴定为爬虫时该字段表示爬虫的类型）',
  `ip` varchar(64) DEFAULT NULL COMMENT '操作用户的ip',
  `ua` varchar(500) DEFAULT NULL COMMENT '操作用户的user_agent',
  `os` varchar(64) DEFAULT NULL COMMENT '评论时的系统类型',
  `browser` varchar(64) DEFAULT NULL COMMENT '评论时的浏览器类型',
  `request_url` varchar(3000) DEFAULT NULL COMMENT '请求的路径',
  `referer` varchar(3000) DEFAULT NULL COMMENT '请求来源地址',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=236 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sys_log`
--

LOCK TABLES `sys_log` WRITE;
/*!40000 ALTER TABLE `sys_log` DISABLE KEYS */;
INSERT INTO `sys_log` VALUES (1,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-12 09:16:54','2024-09-12 09:16:54'),(2,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入留言板页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/guestbook','http://localhost:8443/','2024-09-12 09:17:48','2024-09-12 09:17:48'),(3,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 查看sitemap.html','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/sitemap.html','http://localhost:8443/','2024-09-12 09:17:58','2024-09-12 09:17:58'),(4,NULL,'SYSTEM','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入登录页面','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/passport/login/',NULL,'2024-09-12 09:21:09','2024-09-12 09:21:09'),(5,NULL,'SYSTEM','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: [\"\"]登录系统','{\"username\":[\"\"],\"password\":[\"\"]}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/passport/signin','http://localhost:8085/passport/login/','2024-09-12 09:21:19','2024-09-12 09:21:19'),(6,1,'SYSTEM','INFO','用户: [root] | 操作: [\"root\"]登录系统','{\"username\":[\"root\"],\"password\":[\"123456\"]}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/passport/signin','http://localhost:8085/passport/login/','2024-09-12 09:21:32','2024-09-12 09:21:32'),(7,1,'SYSTEM','INFO','用户: [root] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/','http://localhost:8085/passport/login/','2024-09-12 09:21:32','2024-09-12 09:21:32'),(8,1,'SYSTEM','INFO','用户: [root] | 操作: 进入文章列表页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/articles','http://localhost:8085/','2024-09-12 09:21:48','2024-09-12 09:21:48'),(9,1,'SYSTEM','INFO','用户: [root] | 操作: 进入分类列表页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/article/types','http://localhost:8085/articles','2024-09-12 09:21:57','2024-09-12 09:21:57'),(10,1,'SYSTEM','INFO','用户: [root] | 操作: 进入评论页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/comments','http://localhost:8085/article/types','2024-09-12 09:22:03','2024-09-12 09:22:03'),(11,1,'SYSTEM','INFO','用户: [root] | 操作: 进入模板管理页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/templates','http://localhost:8085/comments','2024-09-12 09:22:21','2024-09-12 09:22:21'),(12,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8085/','2024-09-12 09:22:38','2024-09-12 09:22:38'),(13,1,'SYSTEM','INFO','用户: [root] | 操作: 获取模板详情','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/template/get/6','http://localhost:8085/templates','2024-09-12 09:34:09','2024-09-12 09:34:09'),(14,1,'SYSTEM','INFO','用户: [root] | 操作: 进入社会化登录配置管理页面','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/socials','http://localhost:8085/templates','2024-09-12 09:41:22','2024-09-12 09:41:22'),(15,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入文章[2]详情页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/article/2','http://localhost:8443/','2024-09-12 10:21:14','2024-09-12 10:21:14'),(16,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 14:23:37','2024-09-12 14:23:37'),(17,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 14:48:40','2024-09-12 14:48:40'),(18,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 14:48:43','2024-09-12 14:48:43'),(19,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 14:58:52','2024-09-12 14:58:52'),(20,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 14:58:53','2024-09-12 14:58:53'),(21,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 14:58:55','2024-09-12 14:58:55'),(22,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 14:58:56','2024-09-12 14:58:56'),(23,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 14:58:56','2024-09-12 14:58:56'),(24,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 14:58:56','2024-09-12 14:58:56'),(25,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:05:47','2024-09-12 15:05:47'),(26,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:07:42','2024-09-12 15:07:42'),(27,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:12:39','2024-09-12 15:12:39'),(28,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:15:21','2024-09-12 15:15:21'),(29,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:15:24','2024-09-12 15:15:24'),(30,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:15:24','2024-09-12 15:15:24'),(31,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:15:24','2024-09-12 15:15:24'),(32,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:15:24','2024-09-12 15:15:24'),(33,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:15:24','2024-09-12 15:15:24'),(34,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:16:26','2024-09-12 15:16:26'),(35,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:17:02','2024-09-12 15:17:02'),(36,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:17:44','2024-09-12 15:17:44'),(37,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:19:48','2024-09-12 15:19:48'),(38,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:19:49','2024-09-12 15:19:49'),(39,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:19:50','2024-09-12 15:19:50'),(40,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:19:51','2024-09-12 15:19:51'),(41,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/2','2024-09-12 15:20:18','2024-09-12 15:20:18'),(42,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/','2024-09-12 15:20:25','2024-09-12 15:20:25'),(43,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/','2024-09-12 15:20:27','2024-09-12 15:20:27'),(44,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-12 15:22:47','2024-09-12 15:22:47'),(45,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-12 15:34:12','2024-09-12 15:34:12'),(46,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-12 15:34:15','2024-09-12 15:34:15'),(47,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-12 15:34:19','2024-09-12 15:34:19'),(48,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-12 15:34:19','2024-09-12 15:34:19'),(49,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-12 15:34:19','2024-09-12 15:34:19'),(50,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-12 15:34:45','2024-09-12 15:34:45'),(51,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-12 15:45:47','2024-09-12 15:45:47'),(52,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-12 16:01:08','2024-09-12 16:01:08'),(53,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-12 16:04:15','2024-09-12 16:04:15'),(54,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-13 08:57:01','2024-09-13 08:57:01'),(55,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-13 08:59:31','2024-09-13 08:59:31'),(56,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-13 09:03:33','2024-09-13 09:03:33'),(57,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/','2024-09-13 09:03:37','2024-09-13 09:03:37'),(58,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/','2024-09-13 09:03:44','2024-09-13 09:03:44'),(59,NULL,'VISIT','INFO','访客: [127.0.0.1] | 操作: 进入首页','{}',NULL,'127.0.0.1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/','2024-09-13 09:04:06','2024-09-13 09:04:06'),(60,NULL,'VISIT','INFO','访客: [127.0.0.1] | 操作: 进入首页','{}',NULL,'127.0.0.1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/','2024-09-13 09:04:53','2024-09-13 09:04:53'),(61,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入文章标签[2]列表页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/tag/2','http://localhost:8443/','2024-09-13 09:07:28','2024-09-13 09:07:28'),(62,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/','2024-09-13 09:07:49','2024-09-13 09:07:49'),(63,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/','2024-09-13 09:12:27','2024-09-13 09:12:27'),(64,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/','2024-09-13 09:18:52','2024-09-13 09:18:52'),(65,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入关于页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/about','http://localhost:8443/','2024-09-13 09:32:43','2024-09-13 09:32:43'),(66,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入关于页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/about','http://localhost:8443/','2024-09-13 09:49:03','2024-09-13 09:49:03'),(67,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入关于页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/about','http://localhost:8443/','2024-09-13 09:50:00','2024-09-13 09:50:00'),(68,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入关于页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/about','http://localhost:8443/','2024-09-13 09:50:21','2024-09-13 09:50:21'),(69,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/about','2024-09-13 09:50:49','2024-09-13 09:50:49'),(70,NULL,'SYSTEM','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入登录页面','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/passport/login/',NULL,'2024-09-13 09:53:34','2024-09-13 09:53:34'),(71,1,'SYSTEM','INFO','用户: [root] | 操作: [\"root\"]登录系统','{\"username\":[\"root\"],\"password\":[\"123456\"]}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/passport/signin','http://localhost:8085/passport/login/','2024-09-13 09:53:41','2024-09-13 09:53:41'),(72,1,'SYSTEM','INFO','用户: [root] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/','http://localhost:8085/passport/login/','2024-09-13 09:53:41','2024-09-13 09:53:41'),(73,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/about','2024-09-13 09:55:02','2024-09-13 09:55:02'),(74,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/about','2024-09-13 09:57:47','2024-09-13 09:57:47'),(75,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/about','2024-09-13 09:58:13','2024-09-13 09:58:13'),(76,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8085/','2024-09-13 09:59:54','2024-09-13 09:59:54'),(77,1,'SYSTEM','INFO','用户: [root] | 操作: 进入文章列表页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/articles','http://localhost:8085/','2024-09-13 09:59:58','2024-09-13 09:59:58'),(78,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-13 10:01:08','2024-09-13 10:01:08'),(79,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-13 10:02:31','2024-09-13 10:02:31'),(80,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-13 10:03:02','2024-09-13 10:03:02'),(81,1,'SYSTEM','INFO','用户: [root] | 操作: 进入发表文章页[\"we\"]','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/article/publish-we','http://localhost:8085/articles','2024-09-13 10:05:19','2024-09-13 10:05:19'),(82,1,'SYSTEM','INFO','用户: [root] | 操作: 进入文件管理页面','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/files','http://localhost:8085/article/publish-we','2024-09-13 10:17:48','2024-09-13 10:17:48'),(83,1,'SYSTEM','INFO','用户: [root] | 操作: 进入文件管理页面','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/files','http://localhost:8085/article/publish-we','2024-09-13 10:21:50','2024-09-13 10:21:50'),(84,1,'SYSTEM','INFO','用户: [root] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/','http://localhost:8085/files','2024-09-13 10:21:51','2024-09-13 10:21:51'),(85,1,'SYSTEM','INFO','用户: [root] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/','http://localhost:8085/files','2024-09-13 10:37:15','2024-09-13 10:37:15'),(86,1,'SYSTEM','INFO','用户: [root] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/','http://localhost:8085/files','2024-09-13 10:37:58','2024-09-13 10:37:58'),(87,1,'SYSTEM','INFO','用户: [root] | 操作: 进入文件管理页面','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/files','http://localhost:8085/','2024-09-13 10:40:34','2024-09-13 10:40:34'),(88,1,'SYSTEM','INFO','用户: [root] | 操作: 进入文件管理页面','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/files','http://localhost:8085/','2024-09-13 13:37:05','2024-09-13 13:37:05'),(89,1,'SYSTEM','INFO','用户: [root] | 操作: 添加文件','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/file/add','http://localhost:8085/files','2024-09-13 14:01:30','2024-09-13 14:01:30'),(90,1,'SYSTEM','INFO','用户: [root] | 操作: 进入文件管理页面','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/files','http://localhost:8085/files','2024-09-13 14:01:33','2024-09-13 14:01:33'),(91,1,'SYSTEM','INFO','用户: [root] | 操作: 进入文章列表页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/articles','http://localhost:8085/files','2024-09-13 14:07:18','2024-09-13 14:07:18'),(92,1,'SYSTEM','INFO','用户: [root] | 操作: 进入发表文章页[\"we\"]','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/article/publish-we','http://localhost:8085/articles','2024-09-13 14:07:20','2024-09-13 14:07:20'),(93,1,'SYSTEM','INFO','用户: [root] | 操作: 进入发表文章页[\"we\"]','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/article/publish-we','http://localhost:8085/articles','2024-09-13 14:41:41','2024-09-13 14:41:41'),(94,1,'SYSTEM','INFO','用户: [root] | 操作: wangEditor编辑器中上传文件','{}',NULL,'0:0:0:0:0:0:0:1',NULL,'Unknown','Unknown','http://localhost:8085/article/nulloneblog/article/20240913144458241.png','http://localhost:8085/article/publish-we','2024-09-13 14:45:00','2024-09-13 14:45:00'),(95,1,'SYSTEM','INFO','用户: [root] | 操作: wangEditor编辑器中上传文件','{\"uploadType\":[\"article\"]}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/api/uploadFile','http://localhost:8085/article/publish-we','2024-09-13 14:45:02','2024-09-13 14:45:02'),(96,1,'SYSTEM','INFO','用户: [root] | 操作: wangEditor编辑器中上传文件','{\"uploadType\":[\"article\"]}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/api/uploadFile','http://localhost:8085/article/publish-we','2024-09-13 14:45:07','2024-09-13 14:45:07'),(97,1,'SYSTEM','INFO','用户: [root] | 操作: 进入文章列表页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/articles','http://localhost:8085/article/publish-we','2024-09-13 14:47:10','2024-09-13 14:47:10'),(98,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-13 14:48:10','2024-09-13 14:48:10'),(99,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入文章[3]详情页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/article/3','http://localhost:8443/','2024-09-13 14:48:15','2024-09-13 14:48:15'),(100,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-13 14:48:27','2024-09-13 14:48:27'),(101,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入文章[1]详情页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/article/1','http://localhost:8443/','2024-09-13 14:48:31','2024-09-13 14:48:31'),(102,1,'SYSTEM','INFO','用户: [root] | 操作: 进入修改文章页[id=3]','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/article/update/3','http://localhost:8085/articles','2024-09-13 14:49:18','2024-09-13 14:49:18'),(103,1,'SYSTEM','INFO','用户: [root] | 操作: 进入修改文章页[id=3]','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/article/update/3','http://localhost:8085/articles','2024-09-13 14:49:23','2024-09-13 14:49:23'),(104,1,'SYSTEM','INFO','用户: [root] | 操作: 进入修改文章页[id=3]','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/article/update/3','http://localhost:8085/articles','2024-09-13 14:49:31','2024-09-13 14:49:31'),(105,1,'SYSTEM','INFO','用户: [root] | 操作: 获取文章[3]详情','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/article/get/3','http://localhost:8085/article/update/3','2024-09-13 14:49:40','2024-09-13 14:49:40'),(106,1,'SYSTEM','INFO','用户: [root] | 操作: 进入文章列表页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/articles','http://localhost:8085/article/update/3','2024-09-13 14:51:37','2024-09-13 14:51:37'),(107,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/','2024-09-13 14:51:42','2024-09-13 14:51:42'),(108,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/','2024-09-13 14:51:43','2024-09-13 14:51:43'),(109,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入文章[3]详情页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/article/3','http://localhost:8443/','2024-09-13 14:51:45','2024-09-13 14:51:45'),(110,1,'SYSTEM','INFO','用户: [root] | 操作: 进入文章列表页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/articles','http://localhost:8085/article/update/3','2024-09-13 14:55:15','2024-09-13 14:55:15'),(111,1,'SYSTEM','INFO','用户: [root] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/',NULL,'2024-09-13 14:55:20','2024-09-13 14:55:20'),(112,1,'SYSTEM','INFO','用户: [root] | 操作: 进入分类列表页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/article/types','http://localhost:8085/','2024-09-13 14:55:56','2024-09-13 14:55:56'),(113,1,'SYSTEM','INFO','用户: [root] | 操作: 删除分类','{\"ids\":[\"1\"]}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/type/remove','http://localhost:8085/article/types','2024-09-13 14:57:21','2024-09-13 14:57:21'),(114,1,'SYSTEM','INFO','用户: [root] | 操作: 添加分类','{\"id\":[\"\"],\"position\":[\"scrollmenu\"],\"name\":[\"容器技术\"],\"pid\":[\"\"],\"description\":[\"\"],\"sort\":[\"\"],\"available\":[\"1\"],\"icon\":[\"\"]}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/type/add','http://localhost:8085/article/types','2024-09-13 14:57:59','2024-09-13 14:57:59'),(115,1,'SYSTEM','INFO','用户: [root] | 操作: 添加分类','{\"id\":[\"\"],\"position\":[\"scrollmenu\"],\"name\":[\"k8s\"],\"pid\":[\"\"],\"description\":[\"\"],\"sort\":[\"\"],\"available\":[\"1\"],\"icon\":[\"\"]}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/type/add','http://localhost:8085/article/types','2024-09-13 14:58:08','2024-09-13 14:58:08'),(116,1,'SYSTEM','INFO','用户: [root] | 操作: 进入文章列表页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8085/articles','http://localhost:8085/article/types','2024-09-13 14:58:23','2024-09-13 14:58:23'),(117,1,'SYSTEM','INFO','用户: [root] | 操作: 删除文章[[1,2]]','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://null:8085null','http://localhost:8085/articles','2024-09-13 14:58:36','2024-09-13 14:58:36'),(118,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/',NULL,'2024-09-24 09:59:55','2024-09-24 09:59:55'),(119,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入文章[3]详情页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/article/3','http://localhost:8443/','2024-09-24 10:01:09','2024-09-24 10:01:09'),(120,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/3','2024-09-24 10:02:34','2024-09-24 10:02:34'),(121,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入文章[4]详情页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/article/4',NULL,'2024-09-24 10:04:21','2024-09-24 10:04:21'),(122,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Windows 10','Chrome 12','http://localhost:8443/','http://localhost:8443/article/4','2024-09-24 10:04:27','2024-09-24 10:04:27'),(123,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://localhost:8443/',NULL,'2024-12-04 15:28:24','2024-12-04 15:28:24'),(124,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://localhost:8443/',NULL,'2024-12-04 15:39:12','2024-12-04 15:39:12'),(125,NULL,'VISIT','INFO','访客: [0:0:0:0:0:0:0:1] | 操作: 进入首页','{}',NULL,'0:0:0:0:0:0:0:1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://localhost:8443/',NULL,'2024-12-04 15:43:11','2024-12-04 15:43:11'),(126,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 14:58:44','2025-08-11 14:58:44'),(127,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 14:58:54','2025-08-11 14:58:54'),(128,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 14:59:26','2025-08-11 14:59:26'),(129,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:01:46','2025-08-11 15:01:46'),(130,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:01:51','2025-08-11 15:01:51'),(131,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:08:39','2025-08-11 15:08:39'),(132,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:11:03','2025-08-11 15:11:03'),(133,NULL,'VISIT','INFO','访客: [null] | 操作: 进入文章[3]详情页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:11:11','2025-08-11 15:11:11'),(134,NULL,'VISIT','INFO','访客: [null] | 操作: 进入文章[3]详情页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:11:36','2025-08-11 15:11:36'),(135,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:11:36','2025-08-11 15:11:36'),(136,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:11:36','2025-08-11 15:11:36'),(137,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:13:43','2025-08-11 15:13:43'),(138,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:14:19','2025-08-11 15:14:19'),(139,NULL,'VISIT','INFO','访客: [null] | 操作: 进入文章[3]详情页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:14:23','2025-08-11 15:14:23'),(140,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:15:52','2025-08-11 15:15:52'),(141,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入登录页面','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:20:57','2025-08-11 15:20:57'),(142,NULL,'SYSTEM','INFO','访客: [null] | 操作: [\"admin\"]登录系统','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:21:08','2025-08-11 15:21:08'),(143,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:21:08','2025-08-11 15:21:08'),(144,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:21:14','2025-08-11 15:21:14'),(145,NULL,'VISIT','INFO','访客: [null] | 操作: 进入文章[3]详情页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:21:23','2025-08-11 15:21:23'),(146,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入文章列表页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:21:46','2025-08-11 15:21:46'),(147,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:25:08','2025-08-11 15:25:08'),(148,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:52:17','2025-08-11 15:52:17'),(149,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:52:18','2025-08-11 15:52:18'),(150,NULL,'VISIT','INFO','访客: [null] | 操作: 进入关于页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:52:18','2025-08-11 15:52:18'),(151,NULL,'VISIT','INFO','访客: [null] | 操作: 进入友情链接页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 15:52:18','2025-08-11 15:52:18'),(152,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 16:20:13','2025-08-11 16:20:13'),(153,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入登录页面','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 16:46:27','2025-08-11 16:46:27'),(154,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入登录页面','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 17:47:34','2025-08-11 17:47:34'),(155,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入登录页面','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-11 22:45:54','2025-08-11 22:45:54'),(156,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 00:14:27','2025-08-12 00:14:27'),(157,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 03:41:29','2025-08-12 03:41:29'),(158,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 04:25:11','2025-08-12 04:25:11'),(159,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 04:27:42','2025-08-12 04:27:42'),(160,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入登录页面','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 05:34:46','2025-08-12 05:34:46'),(161,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入登录页面','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 05:43:20','2025-08-12 05:43:20'),(162,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入登录页面','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 05:44:13','2025-08-12 05:44:13'),(163,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入登录页面','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:21:01','2025-08-12 08:21:01'),(164,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:31:35','2025-08-12 08:31:35'),(165,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:33:18','2025-08-12 08:33:18'),(166,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:33:43','2025-08-12 08:33:43'),(167,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入登录页面','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:33:51','2025-08-12 08:33:51'),(168,NULL,'SYSTEM','INFO','访客: [null] | 操作: [\"root\"]登录系统','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:33:55','2025-08-12 08:33:55'),(169,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:33:55','2025-08-12 08:33:55'),(170,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:35:11','2025-08-12 08:35:11'),(171,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:35:23','2025-08-12 08:35:23'),(172,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:44:23','2025-08-12 08:44:23'),(173,NULL,'VISIT','INFO','访客: [127.0.0.1] | 操作: 进入首页','{}',NULL,'127.0.0.1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://127.0.0.1:8443/',NULL,'2025-08-12 08:47:26','2025-08-12 08:47:26'),(174,NULL,'VISIT','INFO','访客: [127.0.0.1] | 操作: 进入首页','{}',NULL,'127.0.0.1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://127.0.0.1:8443/',NULL,'2025-08-12 08:48:42','2025-08-12 08:48:42'),(175,NULL,'VISIT','INFO','访客: [127.0.0.1] | 操作: 进入首页','{}',NULL,'127.0.0.1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://127.0.0.1:8443/',NULL,'2025-08-12 08:51:57','2025-08-12 08:51:57'),(176,NULL,'VISIT','INFO','访客: [127.0.0.1] | 操作: 进入首页','{}',NULL,'127.0.0.1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://127.0.0.1:8443/',NULL,'2025-08-12 08:52:30','2025-08-12 08:52:30'),(177,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:52:33','2025-08-12 08:52:33'),(178,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:54:47','2025-08-12 08:54:47'),(179,NULL,'VISIT','INFO','访客: [127.0.0.1] | 操作: 进入首页','{}',NULL,'127.0.0.1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://127.0.0.1:8443/',NULL,'2025-08-12 08:55:26','2025-08-12 08:55:26'),(180,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:55:40','2025-08-12 08:55:40'),(181,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:58:18','2025-08-12 08:58:18'),(182,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 08:58:44','2025-08-12 08:58:44'),(183,NULL,'VISIT','INFO','访客: [127.0.0.1] | 操作: 进入首页','{}',NULL,'127.0.0.1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://127.0.0.1:8443/',NULL,'2025-08-12 09:01:25','2025-08-12 09:01:25'),(184,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入登录页面','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:01:51','2025-08-12 09:01:51'),(185,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:07:09','2025-08-12 09:07:09'),(186,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:07:17','2025-08-12 09:07:17'),(187,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:07:41','2025-08-12 09:07:41'),(188,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:08:07','2025-08-12 09:08:07'),(189,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:09:04','2025-08-12 09:09:04'),(190,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入登录页面','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:11:34','2025-08-12 09:11:34'),(191,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入首页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/',NULL,'2025-08-12 09:12:38','2025-08-12 09:12:38'),(192,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:22:20','2025-08-12 09:22:20'),(193,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:25:46','2025-08-12 09:25:46'),(194,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:26:53','2025-08-12 09:26:53'),(195,NULL,'VISIT','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:26:57','2025-08-12 09:26:57'),(196,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入首页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/',NULL,'2025-08-12 09:27:57','2025-08-12 09:27:57'),(197,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入登录页面','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:28:06','2025-08-12 09:28:06'),(198,NULL,'SYSTEM','INFO','访客: [null] | 操作: [\"root\"]登录系统','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:28:21','2025-08-12 09:28:21'),(199,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入首页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:28:21','2025-08-12 09:28:21'),(200,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入文章列表页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:28:31','2025-08-12 09:28:31'),(201,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入发表文章页[\"we\"]','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:28:35','2025-08-12 09:28:35'),(202,NULL,'SYSTEM','INFO','访客: [null] | 操作: 发布文章','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:29:53','2025-08-12 09:29:53'),(203,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入文章列表页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:29:55','2025-08-12 09:29:55'),(204,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入首页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/',NULL,'2025-08-12 09:29:58','2025-08-12 09:29:58'),(205,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入文章[4]详情页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/article/4','http://8.140.246.119:8443/','2025-08-12 09:30:06','2025-08-12 09:30:06'),(206,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入发表文章页[\"we\"]','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:30:17','2025-08-12 09:30:17'),(207,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入发表文章页[\"we\"]','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:33:13','2025-08-12 09:33:13'),(208,NULL,'SYSTEM','INFO','访客: [null] | 操作: 发布文章','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:33:49','2025-08-12 09:33:49'),(209,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入文章列表页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:33:50','2025-08-12 09:33:50'),(210,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入首页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/',NULL,'2025-08-12 09:33:55','2025-08-12 09:33:55'),(211,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入发表文章页[\"we\"]','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:34:02','2025-08-12 09:34:02'),(212,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入首页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/',NULL,'2025-08-12 09:39:55','2025-08-12 09:39:55'),(213,NULL,'SYSTEM','INFO','访客: [null] | 操作: 发布文章','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:41:07','2025-08-12 09:41:07'),(214,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入文章列表页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:41:09','2025-08-12 09:41:09'),(215,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入发表文章页[\"we\"]','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:41:12','2025-08-12 09:41:12'),(216,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入发表文章页[\"we\"]','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:43:33','2025-08-12 09:43:33'),(217,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入评论页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:43:40','2025-08-12 09:43:40'),(218,NULL,'SYSTEM','INFO','访客: [null] | 操作: 发布文章','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:44:19','2025-08-12 09:44:19'),(219,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入文章列表页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:44:22','2025-08-12 09:44:22'),(220,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入首页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/',NULL,'2025-08-12 09:48:55','2025-08-12 09:48:55'),(221,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入文章[7]详情页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/article/7','http://8.140.246.119:8443/','2025-08-12 09:49:08','2025-08-12 09:49:08'),(222,NULL,'SYSTEM','INFO','访客: [null] | 操作: 修改文章[7]的状态[\"comment\"]','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 09:49:34','2025-08-12 09:49:34'),(223,NULL,'SYSTEM','INFO','访客: [null] | 操作: 进入文章列表页','{}',NULL,NULL,NULL,'Unknown','Unknown',NULL,NULL,'2025-08-12 10:17:16','2025-08-12 10:17:16'),(224,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入首页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/',NULL,'2025-08-12 10:20:19','2025-08-12 10:20:19'),(225,NULL,'VISIT','INFO','访客: [59.82.21.163] | 操作: 进入首页','{}',NULL,'59.82.21.163','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.8903.185 Safari/537.36','Windows 10','Chrome 9','http://jz0416.top:8443/',NULL,'2025-08-12 10:25:37','2025-08-12 10:25:37'),(226,NULL,'VISIT','INFO','访客: [59.82.21.163] | 操作: 进入首页','{}',NULL,'59.82.21.163','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.1725.141 Safari/537.36','Windows 10','Chrome 10','http://jz0416.top:8443/',NULL,'2025-08-12 10:25:38','2025-08-12 10:25:38'),(227,NULL,'VISIT','INFO','访客: [59.82.21.111] | 操作: 进入文章分类[2]列表页','{}',NULL,'59.82.21.111','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.9348.28 Safari/537.36','Windows 10','Chrome 9','http://jz0416.top:8443/type/2',NULL,'2025-08-12 10:25:38','2025-08-12 10:25:38'),(228,NULL,'VISIT','INFO','访客: [59.82.21.163] | 操作: 进入文章分类[3]列表页','{}',NULL,'59.82.21.163','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.3354.21 Safari/537.36','Windows 10','Chrome 8','http://jz0416.top:8443/type/3',NULL,'2025-08-12 10:25:39','2025-08-12 10:25:39'),(229,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入首页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://jz0416.top:8443/',NULL,'2025-08-12 10:29:52','2025-08-12 10:29:52'),(230,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入首页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/',NULL,'2025-08-12 10:33:15','2025-08-12 10:33:15'),(231,NULL,'VISIT','INFO','访客: [8.140.246.119] | 操作: 进入首页','{}',NULL,'8.140.246.119','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/',NULL,'2025-08-12 10:57:54','2025-08-12 10:57:54'),(232,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入文章[3]详情页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/article/3','http://jz0416.top/','2025-08-12 11:00:02','2025-08-12 11:00:02'),(233,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入文章[5]详情页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/article/5','http://jz0416.top/','2025-08-12 11:00:17','2025-08-12 11:00:17'),(234,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入文章[5]详情页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/article/5','http://8.140.246.119:8443/article/5','2025-08-12 11:00:20','2025-08-12 11:00:20'),(235,NULL,'VISIT','INFO','访客: [117.61.17.47] | 操作: 进入文章[7]详情页','{}',NULL,'117.61.17.47','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36','Windows 10','Chrome 13','http://8.140.246.119:8443/article/7','http://jz0416.top/','2025-08-12 11:00:23','2025-08-12 11:00:23');
/*!40000 ALTER TABLE `sys_log` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `sys_notice`
--

DROP TABLE IF EXISTS `sys_notice`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sys_notice` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL COMMENT '被通知的用户ID',
  `status` enum('RELEASE','NOT_RELEASE') DEFAULT 'NOT_RELEASE' COMMENT '通知状态',
  `title` varchar(200) DEFAULT NULL COMMENT '通知的标题',
  `content` varchar(2000) DEFAULT NULL COMMENT '通知的内容',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sys_notice`
--

LOCK TABLES `sys_notice` WRITE;
/*!40000 ALTER TABLE `sys_notice` DISABLE KEYS */;
INSERT INTO `sys_notice` VALUES (1,1,'RELEASE','个人博客','','2024-09-12 09:01:14','2024-09-12 09:01:14'),(2,1,'RELEASE','问题反馈','在使用过程中，有问题请先参考相关文档，确实无法解决的，请优先提Issue，感谢各位老铁','2024-09-12 09:01:14','2024-09-12 09:01:14');
/*!40000 ALTER TABLE `sys_notice` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `sys_resources`
--

DROP TABLE IF EXISTS `sys_resources`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sys_resources` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `type` varchar(50) DEFAULT NULL,
  `url` varchar(200) DEFAULT NULL,
  `permission` varchar(100) DEFAULT NULL,
  `parent_id` bigint(20) unsigned DEFAULT '0',
  `sort` int(10) unsigned DEFAULT NULL,
  `external` tinyint(3) unsigned DEFAULT NULL COMMENT '是否外部链接',
  `available` tinyint(3) unsigned DEFAULT '0',
  `icon` varchar(100) DEFAULT NULL COMMENT '菜单图标',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_sys_resource_parent_id` (`parent_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=91 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sys_resources`
--

LOCK TABLES `sys_resources` WRITE;
/*!40000 ALTER TABLE `sys_resources` DISABLE KEYS */;
INSERT INTO `sys_resources` VALUES (1,'用户管理','menu','','',0,4,0,1,'fa fa-users','2024-09-12 09:01:14','2024-09-12 09:01:14'),(2,'用户列表','menu','/users','users',1,1,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(3,'新增用户','button',NULL,'user:add',2,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(4,'批量删除用户','button',NULL,'user:batchDelete',2,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(5,'编辑用户','button',NULL,'user:edit,user:get',2,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(6,'删除用户','button',NULL,'user:delete',2,5,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(7,'分配用户角色','button',NULL,'user:allotRole',2,6,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(8,'权限管理','menu','','',0,3,0,1,'fa fa-cogs','2024-09-12 09:01:14','2024-09-12 09:01:14'),(9,'资源管理','menu','/resources','resources',8,1,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(10,'新增资源','button',NULL,'resource:add',9,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(11,'批量删除资源','button',NULL,'resource:batchDelete',9,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(12,'编辑资源','button',NULL,'resource:edit,resource:get',9,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(13,'删除资源','button',NULL,'resource:delete',9,5,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(14,'角色管理','menu','/roles','roles',8,2,0,1,'','2024-09-12 09:01:14','2024-09-12 09:01:14'),(15,'新增角色','button',NULL,'role:add',14,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(16,'批量删除角色','button',NULL,'role:batchDelete',14,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(17,'编辑角色','button',NULL,'role:edit,role:get',14,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(18,'删除角色','button',NULL,'role:delete',14,5,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(19,'分配角色资源','button',NULL,'role:allotResource',14,6,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(20,'文章管理','menu','','',0,1,0,1,'fa fa-list','2024-09-12 09:01:14','2024-09-12 09:01:14'),(21,'文章列表','menu','/articles','articles',20,1,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(22,'发表文章','button',NULL,'article:publish',21,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(23,'批量删除文章','button',NULL,'article:batchDelete',21,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(24,'批量推送文章','button',NULL,'article:batchPush',21,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(25,'推送文章','button',NULL,'article:push',21,5,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(26,'置顶文章','button',NULL,'article:top',21,6,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(27,'推荐文章','button',NULL,'article:recommend',21,7,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(28,'编辑文章','button',NULL,'article:edit,article:get',21,8,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(29,'删除文章','button',NULL,'article:delete',21,9,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(30,'分类列表','menu','/article/types','types',20,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(31,'添加分类','button',NULL,'type:add',30,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(32,'批量删除分类','button',NULL,'type:batchDelete',30,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(33,'编辑分类','button',NULL,'type:edit,type:get',30,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(34,'删除分类','button',NULL,'type:delete',30,5,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(35,'标签列表','menu','/article/tags','tags',20,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(36,'添加标签','button',NULL,'tag:add',35,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(37,'批量删除标签','button',NULL,'tag:batchDelete',35,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(38,'编辑标签','button',NULL,'tag:edit,tag:get',35,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(39,'删除标签','button',NULL,'tag:delete',35,5,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(40,'网站管理','menu','','',0,2,0,1,'fa fa-globe','2024-09-12 09:01:14','2024-09-12 09:01:14'),(41,'友情链接','menu','/links','links',40,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(42,'添加友情链接','button',NULL,'link:add',41,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(43,'批量删除友情链接','button',NULL,'link:batchDelete',41,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(44,'编辑友情链接','button',NULL,'link:edit,link:get',41,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(45,'删除友情链接','button',NULL,'link:delete',41,5,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(46,'评论管理','menu','/comments','comments',40,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(47,'批量删除评论','button',NULL,'comment:batchDelete',46,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(48,'回复评论','button',NULL,'comment:reply',46,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(49,'审核评论','button',NULL,'comment:audit',46,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(50,'删除评论','button',NULL,'comment:delete',46,5,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(51,'模板管理','menu','/templates','templates',40,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(52,'添加模板','button',NULL,'template:add',51,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(53,'批量删除模板','button',NULL,'template:batchDelete',51,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(54,'编辑模板','button',NULL,'template:edit,template:get',51,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(55,'删除模板','button',NULL,'template:delete',51,5,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(56,'更新日志','menu','/updates','updateLogs',40,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(57,'添加更新日志','button',NULL,'updateLog:add',51,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(58,'批量删除更新日志','button',NULL,'updateLog:batchDelete',51,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(59,'编辑更新日志','button',NULL,'updateLog:edit,updateLog:get',51,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(60,'删除更新日志','button',NULL,'updateLog:delete',51,5,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(61,'公告管理','menu','/notices','notices',40,5,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(62,'添加公告','button',NULL,'notice:add',61,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(63,'批量删除公告','button',NULL,'notice:batchDelete',61,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(64,'编辑公告','button',NULL,'notice:edit,notice:get',61,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(65,'删除公告','button',NULL,'notice:delete',61,5,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(66,'发布公告','button',NULL,'notice:release',61,6,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(67,'撤回公告','button',NULL,'notice:withdraw',61,7,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(68,'测试页面','menu','','',0,6,0,1,'fa fa-desktop','2024-09-12 09:01:14','2024-09-12 09:01:14'),(69,'icons图标','menu','/icons','icons',68,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(70,'shiro测试','menu','/shiro','shiro',68,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(71,'推送消息','menu','/notice','notice',72,NULL,0,1,'','2024-09-12 09:01:14','2024-09-12 09:01:14'),(72,'实验室','menu','','',0,5,0,1,'fa fa-flask','2024-09-12 09:01:14','2024-09-12 09:01:14'),(73,'文章搬运工','menu','/remover','remover',72,NULL,0,1,'','2024-09-12 09:01:14','2024-09-12 09:01:14'),(74,'编辑器','menu','/editor','editor',68,NULL,0,1,'','2024-09-12 09:01:14','2024-09-12 09:01:14'),(75,'文件管理','menu','/files','files',40,6,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(76,'社会化登录配置管理','menu','/socials','socials',40,7,0,1,'','2024-09-12 09:01:14','2024-09-12 09:01:14'),(77,'新增社会化登录配置','button',NULL,'social:add',76,2,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(78,'批量删除社会化登录配置','button',NULL,'social:batchDelete',76,3,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(79,'编辑社会化登录配置','button',NULL,'social:edit,social:get',76,4,0,1,NULL,'2024-09-12 09:01:14','2024-09-12 09:01:14'),(80,'删除社会化登录配置','button',NULL,'social:delete',76,5,0,1,NULL,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(81,'自定义页面管理','menu','/page','page',40,7,0,1,'','2024-09-12 09:01:15','2024-09-12 09:01:15'),(82,'新增自定义页面','button',NULL,'page:add',81,2,0,1,NULL,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(83,'批量删除自定义页面','button',NULL,'page:batchDelete',81,3,0,1,NULL,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(84,'编辑自定义页面','button',NULL,'page:edit,page:get',81,4,0,1,NULL,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(85,'删除自定义页面','button',NULL,'page:delete',81,5,0,1,NULL,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(86,'广告管理','menu','/bizAd','bizAds',40,7,0,1,'','2024-09-12 09:01:15','2024-09-12 09:01:15'),(87,'新增广告','button',NULL,'bizAd:add',86,2,0,1,NULL,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(88,'批量删除广告','button',NULL,'bizAd:batchDelete',86,3,0,1,NULL,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(89,'编辑广告','button',NULL,'bizAd:edit,bizAd:get',86,4,0,1,NULL,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(90,'删除广告','button',NULL,'bizAd:delete',86,5,0,1,NULL,'2024-09-12 09:01:15','2024-09-12 09:01:15');
/*!40000 ALTER TABLE `sys_resources` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `sys_role`
--

DROP TABLE IF EXISTS `sys_role`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sys_role` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL COMMENT '角色名',
  `description` varchar(100) DEFAULT NULL,
  `available` tinyint(1) DEFAULT '0',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sys_role`
--

LOCK TABLES `sys_role` WRITE;
/*!40000 ALTER TABLE `sys_role` DISABLE KEYS */;
INSERT INTO `sys_role` VALUES (1,'role:root','超级管理员',1,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(2,'role:admin','管理员',1,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(3,'role:comment','评论审核管理员',1,'2024-09-12 09:01:15','2024-09-12 09:01:15');
/*!40000 ALTER TABLE `sys_role` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `sys_role_resources`
--

DROP TABLE IF EXISTS `sys_role_resources`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sys_role_resources` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `role_id` bigint(20) unsigned NOT NULL,
  `resources_id` bigint(20) unsigned NOT NULL,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sys_role_resources`
--

LOCK TABLES `sys_role_resources` WRITE;
/*!40000 ALTER TABLE `sys_role_resources` DISABLE KEYS */;
INSERT INTO `sys_role_resources` VALUES (1,1,1,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(2,1,2,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(3,1,3,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(4,1,4,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(5,1,5,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(6,1,6,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(7,1,7,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(8,1,8,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(9,1,9,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(10,1,10,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(11,1,11,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(12,1,12,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(13,1,13,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(14,1,14,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(15,1,15,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(16,1,16,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(17,1,17,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(18,1,18,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(19,1,19,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(20,1,20,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(21,1,21,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(22,1,22,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(23,1,23,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(24,1,24,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(25,1,25,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(26,1,26,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(27,1,27,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(28,1,28,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(29,1,29,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(30,1,30,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(31,1,31,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(32,1,32,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(33,1,33,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(34,1,34,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(35,1,35,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(36,1,36,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(37,1,37,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(38,1,38,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(39,1,39,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(40,1,40,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(41,1,41,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(42,1,42,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(43,1,43,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(44,1,44,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(45,1,45,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(46,1,46,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(47,1,47,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(48,1,48,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(49,1,49,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(50,1,50,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(51,1,51,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(52,1,52,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(53,1,57,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(54,1,53,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(55,1,58,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(56,1,54,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(57,1,59,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(58,1,55,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(59,1,60,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(60,1,56,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(61,1,61,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(62,1,62,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(63,1,63,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(64,1,64,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(65,1,65,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(66,1,66,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(67,1,67,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(68,1,68,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(84,2,20,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(85,2,21,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(86,2,24,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(87,2,25,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(88,2,26,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(89,2,27,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(93,3,40,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(94,3,46,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(95,3,48,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(96,3,49,'2024-09-12 09:01:15','2024-09-12 09:01:15');
/*!40000 ALTER TABLE `sys_role_resources` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `sys_social_config`
--

DROP TABLE IF EXISTS `sys_social_config`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sys_social_config` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `client_id` varchar(255) DEFAULT NULL COMMENT '应用ID',
  `client_secret` varchar(255) DEFAULT NULL COMMENT '应用密钥',
  `redirect_uri` varchar(255) DEFAULT NULL COMMENT '认证成功后跳转的地址',
  `platform_name` varchar(255) DEFAULT NULL COMMENT '应用名',
  `platform` varchar(50) NOT NULL COMMENT '第三方平台',
  `logo` varchar(255) DEFAULT NULL COMMENT '应用 LOGO',
  `alipay_public_key` varchar(500) DEFAULT NULL COMMENT '支付宝公钥',
  `union_id` bit(1) DEFAULT NULL COMMENT '是否需要申请unionid',
  `stack_overflow_key` varchar(200) DEFAULT NULL COMMENT 'Stack Overflow Key',
  `agent_id` varchar(200) DEFAULT NULL COMMENT '授权方的网页应用ID',
  `scope` varchar(200) DEFAULT NULL COMMENT '授权范围',
  `available` bit(1) DEFAULT b'1' COMMENT '当前配置是否可用',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='社会化登录应用';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sys_social_config`
--

LOCK TABLES `sys_social_config` WRITE;
/*!40000 ALTER TABLE `sys_social_config` DISABLE KEYS */;
/*!40000 ALTER TABLE `sys_social_config` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `sys_template`
--

DROP TABLE IF EXISTS `sys_template`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sys_template` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `ref_key` varchar(100) DEFAULT NULL COMMENT '键',
  `ref_value` text COMMENT '模板内容',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sys_template`
--

LOCK TABLES `sys_template` WRITE;
/*!40000 ALTER TABLE `sys_template` DISABLE KEYS */;
INSERT INTO `sys_template` VALUES (1,'TM_SITEMAP_XML','<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<urlset xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\">\r\n	<url>\r\n		<loc>${config.siteUrl}</loc>\r\n		<priority>1.0</priority>\r\n		<lastmod>${.now?string(\"yyyy-MM-dd\")}</lastmod>\r\n		<changefreq>daily</changefreq>\r\n	</url>\r\n	<url>\r\n		<loc>${config.siteUrl}/about</loc>\r\n		<priority>0.6</priority>\r\n		<lastmod>${.now?string(\"yyyy-MM-dd\")}</lastmod>\r\n		<changefreq>daily</changefreq>\r\n	</url>\r\n	<url>\r\n		<loc>${config.siteUrl}/links</loc>\r\n		<priority>0.6</priority>\r\n		<lastmod>${.now?string(\"yyyy-MM-dd\")}</lastmod>\r\n		<changefreq>daily</changefreq>\r\n	</url>\r\n	<url>\r\n		<loc>${config.siteUrl}/guestbook</loc>\r\n		<priority>0.6</priority>\r\n		<lastmod>${.now?string(\"yyyy-MM-dd\")}</lastmod>\r\n		<changefreq>daily</changefreq>\r\n	</url>\r\n	<url>\r\n		<loc>${config.siteUrl}/updateLog</loc>\r\n		<priority>0.6</priority>\r\n		<lastmod>${.now?string(\"yyyy-MM-dd\")}</lastmod>\r\n		<changefreq>daily</changefreq>\r\n	</url>\r\n	<url>\r\n		<loc>${config.siteUrl}/recommended</loc>\r\n		<priority>0.6</priority>\r\n		<lastmod>${.now?string(\"yyyy-MM-dd\")}</lastmod>\r\n		<changefreq>daily</changefreq>\r\n	</url>\r\n	<#list articleList as item>\r\n		<url>\r\n			<loc>${config.siteUrl}/article/${item.id}</loc>\r\n			<priority>0.6</priority>\r\n			<lastmod>${item.updateTime?string(\"yyyy-MM-dd\")}</lastmod>\r\n			<changefreq>daily</changefreq>\r\n		</url>\r\n	</#list>\r\n	<#list articleTypeList as item>\r\n	   <url>\r\n			<loc>${config.siteUrl}/type/${item.id}</loc>\r\n			<priority>0.6</priority>\r\n			<lastmod>${item.updateTime?string(\"yyyy-MM-dd\")}</lastmod>\r\n			<changefreq>daily</changefreq>\r\n		</url>\r\n	</#list>\r\n	\r\n	<#list articleTagsList as item>\r\n	   <url>\r\n			<loc>${config.siteUrl}/tag/${item.id}</loc>\r\n			<priority>0.6</priority>\r\n			<lastmod>${item.updateTime?string(\"yyyy-MM-dd\")}</lastmod>\r\n			<changefreq>daily</changefreq>\r\n		</url>\r\n	</#list>\r\n</urlset>','2024-09-12 09:01:14','2024-09-12 09:01:14'),(2,'TM_SITEMAP_TXT','${config.siteUrl}\r\n${config.siteUrl}/about\r\n${config.siteUrl}/links\r\n${config.siteUrl}/guestbook\r\n${config.siteUrl}/updateLog\r\n${config.siteUrl}/recommended\r\n<#list articleList as item>\r\n${config.siteUrl}/article/${item.id}\r\n</#list>\r\n<#list articleTypeList as item>\r\n${config.siteUrl}/type/${item.id}\r\n</#list>\r\n<#list articleTagsList as item>\r\n${config.siteUrl}/tag/${item.id}\r\n</#list>','2024-09-12 09:01:14','2024-09-12 09:01:14'),(3,'TM_SITEMAP_HTML','<!DOCTYPE html>\r\n<html lang=\"zh-CN\">\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\r\n    <title>${config.siteName} 网站地图</title>\r\n    <meta name=\"author\" content=\"SiteMapX.com\"/>\r\n    <meta name=\"robots\" content=\"index,follow\"/>\r\n    <style type=\"text/css\">\r\n        body {\r\n            color: #000000;\r\n            background: #ffffff;\r\n            margin: 20px;\r\n            font-family: Verdana, Arial, Helvetica, sans-serif;\r\n            font-size: 12px;\r\n        }\r\n\r\n        #myTable {\r\n            list-style: none;\r\n            margin: 10px 0px 10px 0px;\r\n            padding: 0px;\r\n            width: 100%;\r\n            min-width: 804px;\r\n        }\r\n\r\n        #myTable li {\r\n            list-style-type: none;\r\n            width: 100%;\r\n            min-width: 404px;\r\n            height: 20px;\r\n            line-height: 20px;\r\n        }\r\n\r\n        .pull-left{\r\n            float: left!important;\r\n        }\r\n        .pull-right{\r\n            float: right!important;\r\n        }\r\n\r\n        #myTable li .T1-h {\r\n            font-weight: bold;\r\n            min-width: 300px;\r\n        }\r\n\r\n        #myTable li .T2-h {\r\n            width: 200px;\r\n            font-weight: bold;\r\n        }\r\n\r\n        #myTable li .T3-h {\r\n            width: 200px;\r\n            font-weight: bold;\r\n        }\r\n\r\n        #myTable li .T4-h {\r\n            width: 100px;\r\n            font-weight: bold;\r\n        }\r\n\r\n        #myTable li .T1 {\r\n            min-width: 300px;\r\n        }\r\n\r\n        #myTable li .T2 {\r\n            width: 200px;\r\n        }\r\n\r\n        #myTable li .T3 {\r\n            width: 200px;\r\n        }\r\n\r\n        #myTable li .T4 {\r\n            width: 100px;\r\n        }\r\n\r\n        #footer {\r\n            padding: 2px;\r\n            margin: 0px;\r\n            font-size: 8pt;\r\n            color: gray;\r\n            min-width: 900px;\r\n        }\r\n\r\n        #footer a {\r\n            color: gray;\r\n        }\r\n\r\n        .myClear {\r\n            clear: both;\r\n        }\r\n\r\n        #nav, #content, #footer {padding: 8px; border: 1px solid #EEEEEE; clear: both; width: 95%; margin: auto; margin-top: 10px;}\r\n\r\n    </style>\r\n</head>\r\n<body>\r\n<h2 style=\"text-align: center; margin-top: 20px\">${config.siteName?if_exists} 网站地图 </h2>\r\n<div id=\"nav\"><a href=\"${config.siteUrl?if_exists}\"><strong>${config.siteName?if_exists}</strong></a> &raquo; <a href=\"${config.siteUrl?if_exists}/sitemap.html\">站点地图</a></div>\r\n<div id=\"content\">\r\n    <h3>最新文章</h3>\r\n    <ul id=\"myTable\">\r\n        <li>\r\n            <div class=\"T1-h pull-left\">URL</div>\r\n            <div class=\"T2-h pull-right\">Last Change</div>\r\n            <div class=\"T3-h pull-right\">Change Frequency</div>\r\n            <div class=\"T4-h pull-right\">Priority</div>\r\n        </li>\r\n        <div class=\"myClear\"></div>\r\n        <li>\r\n            <div class=\"T1 pull-left\"><a href=\"${config.siteUrl}\" title=\"${config.siteName}\">${config.siteName} | 一个程序员的个人博客</a></div>\r\n            <div class=\"T2 pull-right\">${.now?string(\"yyyy-MM-dd\")}</div>\r\n            <div class=\"T3 pull-right\">daily</div>\r\n            <div class=\"T4 pull-right\">1</div>\r\n        </li>\r\n        <div class=\"myClear\"></div>\r\n        <li>\r\n            <div class=\"T1 pull-left\"><a href=\"${config.siteUrl}/about\" title=\"${config.siteName}\">关于 | ${config.siteName}</a></div>\r\n            <div class=\"T2 pull-right\">${.now?string(\"yyyy-MM-dd\")}</div>\r\n            <div class=\"T3 pull-right\">daily</div>\r\n            <div class=\"T4 pull-right\">0.6</div>\r\n        </li>\r\n        <div class=\"myClear\"></div>\r\n        <li>\r\n            <div class=\"T1 pull-left\"><a href=\"${config.siteUrl}/links\" title=\"${config.siteName}\">友情链接 | ${config.siteName}</a></div>\r\n            <div class=\"T2 pull-right\">${.now?string(\"yyyy-MM-dd\")}</div>\r\n            <div class=\"T3 pull-right\">daily</div>\r\n            <div class=\"T4 pull-right\">0.6</div>\r\n        </li>\r\n        <div class=\"myClear\"></div>\r\n        <li>\r\n            <div class=\"T1 pull-left\"><a href=\"${config.siteUrl}/guestbook\" title=\"${config.siteName}\">留言板 | ${config.siteName}</a></div>\r\n            <div class=\"T2 pull-right\">${.now?string(\"yyyy-MM-dd\")}</div>\r\n            <div class=\"T3 pull-right\">daily</div>\r\n            <div class=\"T4 pull-right\">0.6</div>\r\n        </li>\r\n        <div class=\"myClear\"></div>\r\n        <li>\r\n            <div class=\"T1 pull-left\"><a href=\"${config.siteUrl}/updateLog\" title=\"${config.siteName}\">网站更新记录 | ${config.siteName}</a></div>\r\n            <div class=\"T2 pull-right\">${.now?string(\"yyyy-MM-dd\")}</div>\r\n            <div class=\"T3 pull-right\">daily</div>\r\n            <div class=\"T4 pull-right\">0.6</div>\r\n        </li>\r\n		<div class=\"myClear\"></div>\r\n        <li>\r\n            <div class=\"T1 pull-left\"><a href=\"${config.siteUrl}/recommended\" title=\"${config.siteName}\">站长推荐 | ${config.siteName}</a></div>\r\n            <div class=\"T2 pull-right\">${.now?string(\"yyyy-MM-dd\")}</div>\r\n            <div class=\"T3 pull-right\">daily</div>\r\n            <div class=\"T4 pull-right\">0.6</div>\r\n        </li>\r\n        <div class=\"myClear\"></div>\r\n        <#list articleList as item>\r\n            <li>\r\n                <div class=\"T1 pull-left\"><a href=\"${config.siteUrl}/article/${item.id}\" title=\"${item.title}\">${item.title} | ${config.siteName}</a></div>\r\n                <div class=\"T2 pull-right\">${item.updateTime?string(\"yyyy-MM-dd\")}</div>\r\n                <div class=\"T3 pull-right\">daily</div>\r\n                <div class=\"T4 pull-right\">0.6</div>\r\n            </li>\r\n            <div class=\"myClear\"></div>\r\n        </#list>\r\n    </ul>\r\n</div>\r\n<div id=\"content\">\r\n    <h3>分类目录</h3>\r\n    <ul id=\"myTable\">\r\n        <#list articleTypeList as item>\r\n            <li>\r\n                <div class=\"T1 pull-left\"><a href=\"${config.siteUrl}/type/${item.id}\" title=\"${item.name}\">${item.name} | ${config.siteName}</a></div>\r\n                <div class=\"T2 pull-right\">${item.updateTime?string(\"yyyy-MM-dd\")}</div>\r\n                <div class=\"T3 pull-right\">daily</div>\r\n                <div class=\"T4 pull-right\">0.6</div>\r\n            </li>\r\n            <div class=\"myClear\"></div>\r\n        </#list>\r\n    </ul>\r\n</div>\r\n<div id=\"content\">\r\n    <h3>标签目录</h3>\r\n    <ul id=\"myTable\">\r\n        <#list articleTagsList as item>\r\n            <li>\r\n                <div class=\"T1 pull-left\"><a href=\"${config.siteUrl}/tag/${item.id}\" title=\"${item.name}\">${item.name} | ${config.siteName}</a></div>\r\n                <div class=\"T2 pull-right\">${item.updateTime?string(\"yyyy-MM-dd\")}</div>\r\n                <div class=\"T3 pull-right\">daily</div>\r\n                <div class=\"T4 pull-right\">0.6</div>\r\n            </li>\r\n            <div class=\"myClear\"></div>\r\n        </#list>\r\n    </ul>\r\n</div>\r\n<div id=\"footer\">\r\n    该文件由<a href=\"${config.siteUrl}\" title=\"${config.siteName}\">${config.siteName}</a>网站自动生成。\r\n</div>\r\n</body>\r\n</html>','2024-09-12 09:01:14','2024-09-12 09:01:14'),(4,'TM_ROBOTS','Crawl-delay: 5\r\nSitemap: ${config.cmsUrl}/sitemap.txt\r\nSitemap: ${config.cmsUrl}/sitemap.xml\r\nSitemap: ${config.cmsUrl}/sitemap.html\r\n','2024-09-12 09:01:14','2024-09-12 09:01:14'),(5,'TM_LINKS','<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <title>友情链接操作通知</title>\r\n</head>\r\n<body>\r\n<div style=\"border-radius:5px;font-size:13px;width:680px;font-family:微软雅黑,\'Helvetica Neue\',Arial,sans-serif;margin:10px auto 0px;border:1px solid #eee;max-width:100%\">\r\n    <div style=\"width:100%;background:#2f889a;color:#ffffff;border-radius:5px 5px 0 0\">\r\n        <p style=\"font-size:15px;word-break:break-all;padding:20px 32px;margin:0\">\r\n            友情链接操作通知\r\n        </p>\r\n    </div>\r\n    <div style=\"margin:0px auto;width:90%\">\r\n        <p>站长<a href=\"${link.url?if_exists}\" target=\"_blank\">${link.name?if_exists}</a>，您好!</p>\r\n        <p>您于 ${link.createTime?string(\'yyyy-MM-dd HH:mm:ss\')} 提交的友链申请已通过系统审核。以下为您提交的信息，请确认（如有误，请联系我）！</p>\r\n        <p>\r\n        <ul>\r\n            <li>${link.name?if_exists}</li>\r\n            <li>${link.url?if_exists}</li>\r\n            <li>${link.description?if_exists}</li>\r\n            <li>${link.email?if_exists}</li>\r\n            <li>${link.qq?if_exists}</li>\r\n            <li><img src=\"${link.favicon?if_exists}\" width=\"100\" alt=\"LOGO\"></li>\r\n        </ul>\r\n        </p>\r\n        <p>本站会不定期检查连接有效性，如果因为贵站改版、服务到期等原因导致无法正常访问的，我会暂时停掉贵站友链，待贵站可以正常访问后，本站会继续启用贵站友链。</p>\r\n        <p>特别注意：以下情况，本站将在不做任何通知下，<strong>取消友链</strong>！</p>\r\n        <ul>\r\n            <li>私自取消本站友情链接</li>\r\n            <li>更换域名且未通知本站</li>\r\n            <li>网站内容长期不更新</li>\r\n            <li>友链上使用诸如nofollow之类的属性</li>\r\n        </ul>\r\n        <p>感谢您对 <a style=\"text-decoration:none;\" href=\"${config.siteUrl?if_exists}\" target=\"_blank\">${config.siteName?if_exists}</a> 的关注，如您有任何疑问，欢迎来我网站<a style=\"text-decoration:none;\" href=\"${config.siteUrl}/guestbook\" target=\"_blank\">留言</a>。</p>\r\n        <p>（注：此邮件由系统自动发出，请勿回复。）</p>\r\n    </div>\r\n    <div class=\"adL\">\r\n    </div>\r\n</div>\r\n</body>\r\n</html>','2024-09-12 09:01:14','2024-09-12 09:01:14'),(6,'TM_COMMENT_AUDIT','<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <title>评论审核结果通知</title>\r\n</head>\r\n<body>\r\n<div style=\"border-radius:5px;font-size:13px;width:680px;font-family:微软雅黑,\'Helvetica Neue\',Arial,sans-serif;margin:10px auto 0px;border:1px solid #eee;max-width:100%\">\r\n    <div style=\"width:100%;background:#2f889a;color:#ffffff;border-radius:5px 5px 0 0\">\r\n        <p style=\"font-size:15px;word-break:break-all;padding:20px 32px;margin:0\">\r\n            评论审核结果通知\r\n        </p>\r\n    </div>\r\n    <div style=\"margin:0px auto;width:90%\">\r\n        <p>${comment.nickname?if_exists}，您好!</p>\r\n        <p>\r\n            您于 ${comment.createTime?string(\'yyyy-MM-dd HH:mm:ss\')} 在文章《${config.siteUrl?if_exists}${comment.sourceUrl?if_exists}》 上发表的<span class=\"il\">评论</span>：\r\n        </p>\r\n        <div style=\"background:#efefef;margin:15px 0px;padding:1px 15px;border-radius:5px;font-size:14px;color:#333\">${comment.content}</div>\r\n        <#if comment.status == \'APPROVED\'>\r\n        <p>已通过管理员审核并显示。</p>\r\n        <p>\r\n            您可以点击 <a style=\"text-decoration:none;\" href=\"${config.siteUrl}${comment.sourceUrl}\" target=\"_blank\">链接</a>查看回复的完整內容。\r\n        </p>\r\n        <#elseif comment.status == \'REJECT\'>\r\n        <p>审核失败！失败原因：</p>\r\n        <p style=\"background:#efefef;margin:15px 0px;padding:1px 15px;border-radius:5px;font-size:14px;color:#333\">${comment.remark}</p>\r\n        <#elseif comment.status == \'DELETED\'>\r\n        <p>已被管理员删除！删除原因：</p>\r\n        <p style=\"background:#efefef;margin:15px 0px;padding:1px 15px;border-radius:5px;font-size:14px;color:#333\">${comment.remark}</p>\r\n        <#else>\r\n        <p>管理员正在审核中！审核通过后将给您及时发送通知！</p>\r\n        </#if>\r\n        <p>感谢您对 <a style=\"text-decoration:none;\" href=\"${config.siteUrl}\" target=\"_blank\">${config.siteName}</a> 的关注，如您有任何疑问，欢迎来我网站<a style=\"text-decoration:none;\" href=\"${config.siteUrl}/guestbook\" target=\"_blank\">留言</a>。</p>\r\n        <p>（注：此邮件由系统自动发出，请勿回复。）</p>\r\n    </div>\r\n    <div class=\"adL\">\r\n    </div>\r\n</div>\r\n</body>\r\n</html>','2024-09-12 09:01:14','2024-09-12 09:01:14'),(7,'TM_COMMENT_REPLY','<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <title>评论回复通知</title>\r\n</head>\r\n<body>\r\n<div style=\"border-radius:5px;font-size:13px;width:680px;font-family:微软雅黑,\'Helvetica Neue\',Arial,sans-serif;margin:10px auto 0px;border:1px solid #eee;max-width:100%\">\r\n    <div style=\"width:100%;background:#2f889a;color:#ffffff;border-radius:5px 5px 0 0\">\r\n        <p style=\"font-size:15px;word-break:break-all;padding:20px 32px;margin:0\">\r\n            评论回复通知\r\n        </p>\r\n    </div>\r\n    <div style=\"margin:0px auto;width:90%\">\r\n        <p>${comment.nickname}，您好!</p>\r\n        <p>\r\n            您于 ${comment.createTime?string(\'yyyy-MM-dd HH:mm:ss\')} 在文章《${config.siteUrl}${comment.sourceUrl}》 上发表的<span class=\"il\">评论</span>：\r\n        </p>\r\n        <div style=\"background:#efefef;margin:15px 0px;padding:1px 15px;border-radius:5px;font-size:14px;color:#333\">${comment.content}</div>\r\n        <p>\r\n            有了 <strong>新的回复</strong>！您可以点击 <a style=\"text-decoration:none;\" href=\"${config.siteUrl}${comment.sourceUrl}\" target=\"_blank\">链接</a>查看回复的完整內容。\r\n        </p>\r\n        <p>感谢您对 <a style=\"text-decoration:none;\" href=\"${config.siteUrl}\" target=\"_blank\">${config.siteName}</a> 的关注，如您有任何疑问，欢迎来我网站<a style=\"text-decoration:none;\" href=\"${config.siteUrl}/guestbook\" target=\"_blank\">留言</a>。</p>\r\n        <p>（注：此邮件由系统自动发出，请勿回复。）</p>\r\n    </div>\r\n    <div class=\"adL\">\r\n    </div>\r\n</div>\r\n</body>\r\n</html>','2024-09-12 09:01:14','2024-09-12 09:01:14'),(8,'TM_LINKS_TO_ADMIN','<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <title>友情链接操作通知</title>\r\n</head>\r\n<body>\r\n<div style=\"border-radius:5px;font-size:13px;width:680px;font-family:微软雅黑,\'Helvetica Neue\',Arial,sans-serif;margin:10px auto 0px;border:1px solid #eee;max-width:100%\">\r\n    <div style=\"width:100%;background:#2f889a;color:#ffffff;border-radius:5px 5px 0 0\">\r\n        <p style=\"font-size:15px;word-break:break-all;padding:20px 32px;margin:0\">\r\n            友情链接操作通知\r\n        </p>\r\n    </div>\r\n    <div style=\"margin:0px auto;width:90%\">\r\n        <p>有新的友情链接加入，信息如下</p>\r\n        <p>\r\n        <ul>\r\n            <li>${link.name?if_exists}</li>\r\n            <li>${link.url?if_exists}</li>\r\n            <li>${link.description?if_exists}</li>\r\n            <#if link.favicon?exists><li><img src=\"${link.favicon?if_exists}\" width=\"100\" alt=\"LOGO\"></li></#if>\r\n        </ul>\r\n        </p>\r\n        <p><a style=\"text-decoration:none;\" href=\"${config.cmsUrl}\" target=\"_blank\">去后台继续审核</a>。</p>\r\n        <p>（注：此邮件由系统自动发出，请勿回复。）</p>\r\n    </div>\r\n    <div class=\"adL\">\r\n    </div>\r\n</div>\r\n</body>\r\n</html>','2024-09-12 09:01:14','2024-09-12 09:01:14'),(9,'TM_NEW_COMMENT','<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <title>新评论通知</title>\r\n</head>\r\n<body>\r\n<div style=\"border-radius:5px;font-size:13px;width:680px;font-family:微软雅黑,\'Helvetica Neue\',Arial,sans-serif;margin:10px auto 0px;border:1px solid #eee;max-width:100%\">\r\n    <div style=\"width:100%;background:#2f889a;color:#ffffff;border-radius:5px 5px 0 0\">\r\n        <p style=\"font-size:15px;word-break:break-all;padding:20px 32px;margin:0\">\r\n            新评论通知\r\n        </p>\r\n    </div>\r\n    <div style=\"margin:0px auto;width:90%\">\r\n        <p>\r\n            评论内容：\r\n        </p>\r\n        <div style=\"background:#efefef;margin:15px 0px;padding:1px 15px;border-radius:5px;font-size:14px;color:#333\"><#if comment?exists>${comment.content}<#else>**无评论内容**</#if></div>\r\n        <p>\r\n            <a style=\"text-decoration:none;\" href=\"${config.siteUrl}${comment.sourceUrl}\" target=\"_blank\">查看完整评论</a>\r\n        </p>\r\n        <p>（注：此邮件由系统自动发出，请勿回复。）</p>\r\n    </div>\r\n    <div class=\"adL\">\r\n    </div>\r\n</div>\r\n</body>\r\n</html>','2024-09-12 09:01:14','2024-09-12 09:01:14'),(10,'TM_NGINX_FILE_SERVER','server {\r\n    listen 80;\r\n    server_name serverName;\r\n    root serverPath;\r\n	error_page 403 /error.html;\r\n	location = /error.html {\r\n		return 404;\r\n	}\r\n	autoindex off; \r\n	autoindex_exact_size off; \r\n	autoindex_localtime off; \r\n	\r\n	location ^~ / {\r\n		proxy_set_header Host $host:$server_port;\r\n    }\r\n	\r\n	location ~*\\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar|js|css)$ {\r\n		expires 30d;\r\n		valid_referers serverReferers;\r\n		if ($invalid_referer) {\r\n			rewrite ^/ serverLogoPath;\r\n		}\r\n    }\r\n}\r\n','2024-09-12 09:01:14','2024-09-12 09:01:14');
/*!40000 ALTER TABLE `sys_template` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `sys_update_recorde`
--

DROP TABLE IF EXISTS `sys_update_recorde`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sys_update_recorde` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `version` varchar(20) DEFAULT NULL COMMENT '更新版本',
  `description` varchar(2500) DEFAULT NULL COMMENT '更新记录备注',
  `recorde_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '项目更新时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sys_update_recorde`
--

LOCK TABLES `sys_update_recorde` WRITE;
/*!40000 ALTER TABLE `sys_update_recorde` DISABLE KEYS */;
INSERT INTO `sys_update_recorde` VALUES (1,'1.0.1','第一版','2024-09-12 09:01:14','2024-09-12 09:01:14','2024-09-12 09:01:14');
/*!40000 ALTER TABLE `sys_update_recorde` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `sys_user`
--

DROP TABLE IF EXISTS `sys_user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sys_user` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(100) DEFAULT NULL,
  `password` varchar(100) DEFAULT NULL COMMENT '登录密码',
  `nickname` varchar(30) DEFAULT '' COMMENT '昵称',
  `mobile` varchar(30) DEFAULT NULL COMMENT '手机号',
  `email` varchar(100) DEFAULT NULL COMMENT '邮箱地址',
  `qq` varchar(20) DEFAULT NULL COMMENT 'QQ',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `gender` smallint(6) DEFAULT NULL COMMENT '性别',
  `avatar` varchar(255) DEFAULT NULL COMMENT '头像地址',
  `user_type` enum('ROOT','ADMIN','USER') DEFAULT 'ADMIN' COMMENT '超级管理员、管理员、普通用户',
  `company` varchar(100) DEFAULT NULL COMMENT '公司',
  `blog` varchar(255) DEFAULT NULL COMMENT '个人博客地址',
  `location` varchar(255) DEFAULT NULL COMMENT '地址',
  `source` enum('GITHUB','GITEE','WEIBO','DINGTALK','BAIDU','CSDN','CODING','OSCHINA','TENCENT_CLOUD','ALIPAY','TAOBAO','QQ','WECHAT','GOOGLE','FACEBOOK') DEFAULT NULL COMMENT '用户来源',
  `uuid` varchar(50) DEFAULT NULL COMMENT '用户唯一表示(第三方网站)',
  `privacy` tinyint(4) DEFAULT NULL COMMENT '隐私（1：公开，0：不公开）',
  `notification` tinyint(3) unsigned DEFAULT NULL COMMENT '通知：(1：通知显示消息详情，2：通知不显示详情)',
  `score` int(10) unsigned DEFAULT '0' COMMENT '金币值',
  `experience` int(10) unsigned DEFAULT '0' COMMENT '经验值',
  `reg_ip` varchar(30) DEFAULT NULL COMMENT '注册IP',
  `last_login_ip` varchar(30) DEFAULT NULL COMMENT '最近登录IP',
  `last_login_time` datetime DEFAULT NULL COMMENT '最近登录时间',
  `login_count` int(10) unsigned DEFAULT '0' COMMENT '登录次数',
  `remark` varchar(100) DEFAULT NULL COMMENT '用户备注',
  `status` int(10) unsigned DEFAULT NULL COMMENT '用户状态',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sys_user`
--

LOCK TABLES `sys_user` WRITE;
/*!40000 ALTER TABLE `sys_user` DISABLE KEYS */;
INSERT INTO `sys_user` VALUES (1,'root','CGUx1FN++xS+4wNDFeN6DA==','超级管理员','15151551516','843977358@qq.com','843977358',NULL,NULL,'https://static.zhyd.me/static/img/favicon.ico','ROOT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,NULL,'117.61.17.47','2025-08-12 09:28:21',258,NULL,1,'2024-09-12 09:01:15','2025-08-12 09:28:21'),(2,'admin','gXp2EbyZ+sB/A6QUMhiUJQ==','管理员','15151551516','843977358@qq.com','843977358',NULL,NULL,NULL,'ADMIN',NULL,NULL,NULL,NULL,NULL,1,1,0,0,'0:0:0:0:0:0:0:1','117.61.17.47','2025-08-11 15:21:07',3,NULL,1,'2024-09-12 09:01:15','2025-08-11 15:21:07'),(3,'comment-admin','x9qCx3yP05yWfIE5wXbCsg==','评论审核管理员','','','',NULL,NULL,NULL,'ADMIN',NULL,NULL,NULL,NULL,NULL,1,1,0,0,'0:0:0:0:0:0:0:1','0:0:0:0:0:0:0:1','2024-09-12 09:01:15',1,NULL,1,'2024-09-12 09:01:15','2024-09-12 09:01:15');
/*!40000 ALTER TABLE `sys_user` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `sys_user_role`
--

DROP TABLE IF EXISTS `sys_user_role`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sys_user_role` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL,
  `role_id` bigint(20) unsigned NOT NULL,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `sys_user_role`
--

LOCK TABLES `sys_user_role` WRITE;
/*!40000 ALTER TABLE `sys_user_role` DISABLE KEYS */;
INSERT INTO `sys_user_role` VALUES (1,1,1,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(2,2,2,'2024-09-12 09:01:15','2024-09-12 09:01:15'),(3,3,3,'2024-09-12 09:01:15','2024-09-12 09:01:15');
/*!40000 ALTER TABLE `sys_user_role` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2025-08-12 11:02:21
